Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   MartinGale-EA spinnt rum (http://www.expert-advisor.com/forum/showthread.php?t=7114)

MA-EA 19.11.21 12:56

MartinGale-EA spinnt rum
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.

Seit Monaten, wenn nicht seit Jahren, schlag ich mich mit nem eigentlich einfachen MartinGale-EA rum. :rolleyes:

Je nach dem wie der Kurs sich entwickelt, soll er in die jeweilige Richtung eine weitere Order mit mehr Einsatz öffnen. Aber das Einzige was er macht, ist die 1. beiden Orders öffnen, was er auch soll. Allerdings schließt er Beide gleich wieder, öffnet sie wieder, schließt sie gleich wieder und immer so weiter.

MartinGale hin oder her, Strategie hin oder her, ob man davon was hält oder nicht, bitte helft mir, das Ding endlich zum Laufen zu bringen. Und wenns am Ende doch keinen Profit macht, dann lasst das einfach mein Problem sein. ;)

Code:

/*=============================================================================================================
// N O T I Z E N  U N D  I N F O S
//=============================================================================================================

Anscheinend muss DONO mehr als doppelt so groß wie Spread sein,
weil sonst nicht alle Spread-Kosten wieder rein kommen?


//-------------------------------------------------------------------------------------------------------------

In dieser Vers. LoShAL_v7_PRINT.mq4 gibt es 1 OS.

//-------------------------------------------------------------------------------------------------------------

  if( Mr <= -1.0 || Mr >= 1.0 ){
    if( oLmL <= -1.0 || oLmL >= 1.0 )MmL = Mr / oLmL;
    if( oLmL >  -1.0 && oLmL <  1.0 )MmL = Mr * oLmL;}
  if( Mr >  -1.0 && Mr <  1.0 ){
    if( oLmL <= -1.0 || oLmL >= 1.0 )MmL = Mr / oLmL;
    if( oLmL >  -1.0 && oLmL <  1.0 )MmL = Mr * oLmL;}

//=============================================================================================================
// P R O P E R T Y
//============================================================================================================*/
//#property strict
//#ps sorgt anscheinend dafür, dass Kommentare im Konfig-Fenster im MT4 sichtbar sind.
#property copyright"LoShAL_v7_PRINT.mq4"
#property copyright"daniel-rudloff@web.de"
//=============================================================================================================
// B E S C H R E I B U N G
//=============================================================================================================
extern string esTOY="true  = on / yes";
extern string esFON="false = off / no";
//-----------------------------------------------------------------------------------------------------------*/
extern string esB01="Open 1.Sel & 1.Buy.";
extern string esB02="if last Sel >";
extern string esB03="( OrderOpenPrice()";
extern string esB04="+ Dist_ONO )";
extern string esB05="EA multi LotsBuy.";
extern string esB06="If 1.Sel <=";
extern string esB07="( OrderOpenPrice()";
extern string esB08="- D_CAO )";
extern string esB09="EA close all Orders.";
extern string esB10="if last Buy <";
extern string esB11="( OrderOpenPrice()";
extern string esB12="- Dist_ONO )";
extern string esB13="EA multi LotsSel.";
extern string esB14="If 1.Buy >=";
extern string esB15="( OrderOpenPrice()";
extern string esB16="+ D_CAO )";
extern string esB17="EA close all Orders.";
//=============================================================================================================
// E I N S T E L L U N G E N
//=============================================================================================================
extern string esMN="Magic Numbers";
extern int MN_FiSel=12;
extern int MN_FiBuy=34;
extern int MN_NeSel=56;
extern int MN_NeBuy=78;
//-----------------------------------------------------------------------------------------------------------*/
extern string esOOFT1="Open Orders";
extern string esOOFT2="from/till Hour";
extern string esOOFT3="(Server Time)";
extern int FromH=5;//  Vor 5 Uhr starten scheint sich nicht zu lohnen.
extern int TillH=19;// Zum Testen bis einschließlich 19 Uhr öffnen.
//-----------------------------------------------------------------------------------------------------------*/
extern string esTF="TimeFrame";
input ENUM_TIMEFRAMES TF=15;// Zum Testen M15
//-----------------------------------------------------------------------------------------------------------*/
extern int Slippage=12345;
//-----------------------------------------------------------------------------------------------------------*/
extern int SL=525;// ?
//-----------------------------------------------------------------------------------------------------------*/
extern int TP=375;// ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esIITCBSMS1="if IsTradeContexBusy()";
extern string esIITCBSMS2="sleep MS";
extern int slMS=40;// Zum Testen 40ms ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esDOONO1="Dist to OrderOpenPrice()";
extern string esDOONO2="open next Order";
extern int D_ONO=29;// Zum Testen 29
//-----------------------------------------------------------------------------------------------------------*/
extern string esDCAO1="Dist to OrderOpenPrice()";
extern string esDCAO2="close all Orders";
extern int D_CAO=58;// Zum Testen 58
//-----------------------------------------------------------------------------------------------------------*/

extern string esL="Lots";
extern double Lots=0.01;
extern double Lots_Multi=2.8;// Zum Testen 2.8

//-----------------------------------------------------------------------------------------------------------*/

//=============================================================================================================
// G L O B A L E  D E K L A R A T I O N E N
//=============================================================================================================
bool

fiLO,fiSH,neLO,neSH,OC_Sel,OC_Buy

;
//-----------------------------------------------------------------------------------------------------------*/
double

SL_Sel,SL_Buy,TP_Sel,TP_Buy,MSL,
DON_Sel,DON_Buy,DCAO_FiSel,DCAO_FiBuy,
Lots_Sel,Lots_Buy,

L_LO,L_SH

;
//-----------------------------------------------------------------------------------------------------------*/
int

i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,// ?
TI_FiSel,TI_FiBuy,TI_NeSel,TI_NeBuy,
Opened_Sel,Opened_Buy,Need_Sel,Need_Buy

;
//=============================================================================================================
// I N I T
//=============================================================================================================
void OnInit(){ChartSetSymbolPeriod(0,NULL,TF);}
//=============================================================================================================
// E A  F U N K T I O N E N  S T A R T
//=============================================================================================================
void OnTick(){
//=============================================================================================================
// S T O P  L O S S
//=============================================================================================================
//SL auf 0 stellen, wenn oben <1, um irgendwelche Missverständnisse zu vermeiden.
if(SL<1){
SL_Sel=0.0;
SL_Buy=0.0;}
if(SL>=1){
SL_Sel=NormalizeDouble(Bid+SL*Point,Digits);
SL_Buy=NormalizeDouble(Ask-SL*Point,Digits);}
//=============================================================================================================
// T A K E  P R O F I T
//=============================================================================================================
//TP auf 0 stellen, wenn oben <1, um irgendwelche Missverständnisse zu vermeiden.
if(TP<1){
TP_Sel=0.0;
TP_Buy=0.0;}
if(TP>0){
TP_Sel=NormalizeDouble(Bid-TP*Point,Digits);
TP_Buy=NormalizeDouble(Ask+TP*Point,Digits);}
//=============================================================================================================
// L O T S
//=============================================================================================================


  double mL,oLmL,Mr,MmL;

  mL = MarketInfo(Symbol(),MODE_MINLOT);
  Mr = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 


//=============================================================================================================
// O R D E R  S E A R C H  ( i )
//=============================================================================================================
fiLO=false;
fiSH=false;
neLO=false;
neSH=false;
for(i=OrdersTotal()-1;i>=0;i--){
if(OrderSelect(i,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FiBuy)fiLO=true;
if(OrderMagicNumber()==MN_FiSel)fiSH=true;
if(OrderMagicNumber()==MN_NeBuy)neLO=true;
if(OrderMagicNumber()==MN_NeSel)neSH=true;}}}
//=============================================================================================================
// O R D E R  C H E C K  1
//=============================================================================================================
//Wenn nach OS1 gar keine Orders offen sind...
if(fiSH==false&&fiLO==false&&neSH==false&&neLO==false){
//=============================================================================================================
// ( O C 1 )  O P E N  F I R S T  S E L / O P E N  F I R S T  B U Y
//=============================================================================================================
//...und wenn zur Zeit Orders geöffnet werden dürfen, FirstSel und FirstBuy öffnen.
  if(Hour()>=FromH&&Hour()<=TillH){
    if(IsTradeAllowed()==true)TI_FiSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_FiSel,clrBlue);
    if(IsTradeContextBusy()==true)Sleep(slMS);
    if(IsTradeAllowed()==true)TI_FiBuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_FiBuy,clrBlue);
    if(IsTradeContextBusy()==true)Sleep(slMS);
   
    Print( "FiSelFiBuy-Spr=",DoubleToStr(Ask-Bid) );}}// Nach OC1 gar keine Orders offen.
//=============================================================================================================
// O R D E R  C H E C K  2  ( j )
//=============================================================================================================
// Wenn nach OS2/OC2 FirstBuy und FirstSel offen sind...
if(fiLO==true&&fiSH==true){// ?
//=============================================================================================================
// ( O C 2 )  O P E N  N E X T S E L / O P E N  N E X T B U Y
//=============================================================================================================
  for(k=OrdersTotal()-1;k>=0;k--){
  if(OrderSelect(k,SELECT_BY_POS)){
  if(OrderSymbol()==Symbol()){
  //=============================================================================================================
// ( O C 2 )  O P E N  N E X T S E L  ( k )
//=============================================================================================================


//  Nach OC2 FirstBuy raus suchen:
    if( OrderMagicNumber()==MN_FiBuy ){

//    DCAO für FirstBuy berechnen...
      DCAO_FiBuy=NormalizeDouble( OrderOpenPrice() + D_CAO *Point,Digits);
   
//    ...wenn nach OC2 (j) noch kein NextBuy offen ist...
      if( neLO==false ){

//      ...DON_Sel berechnen :
        DON_Sel=NormalizeDouble( OrderOpenPrice() - D_ONO *Point,Digits);

//      Wenn FirstBuy unter DON-Sel ist...
        if( Bid < DON_Sel ){// ?

//        Wenn FirstSel über DCAO ist...
          if( Ask > DCAO_FiSel ){// ?

            Lots_Sel = Lots_Multi * OrderLots();

//          ...zählen, wie viele NextSel offen sind:
            Opened_Sel=0;
            for(i=OrdersTotal()-1;i>=0;i--){
            if(OrderSelect(i,SELECT_BY_POS)){
            if(OrderSymbol()==Symbol()){
            if( OrderMagicNumber()==MN_NeSel )Opened_Sel++;}}}

//          Wenn weniger NextSel als 1 offen ist, NextSel-by-FirstBuy öffnen.
            if( 1 > Opened_Sel ){
              if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots_Sel,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,clrBlue);
              if(IsTradeContextBusy()==true)Sleep(slMS);


              Print( "NextSel-by-FirstBuy:",

                    "-OL()=",OrderLots(),
                    "-Lots_Multi=",Lots_Multi,
                    "-Lots_Sel=",Lots_Sel
                 
                  );


              }}}} }// Nach OC2 FirstBuy über MN raus gesucht.


//=============================================================================================================
//( O C 2 )  O P E N    1 . N E X T B U Y  ( k )
//=============================================================================================================


//  Nach OS2/OC2 FirstSel raus suchen:
    if(OrderMagicNumber()==MN_FiSel){

//    DCAO für FirstSel ausrechnen...
      DCAO_FiSel=NormalizeDouble( OrderOpenPrice() - D_CAO *Point,Digits);

//    Wenn noch kein NextSel offen ist...
      if( neSH==false ){

//      DON-Buy für FirstSel ausrechnen...
        DON_Buy=NormalizeDouble( OrderOpenPrice() + D_ONO *Point,Digits);

//      Wenn FirstSel über DON_Buy ist...
        if( Ask > DON_Buy ){// ?
       
//        ...wenn FirstBuy unter DCAO ist:
          if( Bid < DCAO_FiBuy ){// ?

            Lots_Buy = Lots_Multi * OrderLots();

//          ...zählen, wie viele NextBuy schon offen sind:
            Opened_Buy=0;
            for(k=OrdersTotal()-1;k>=0;k--){
            if(OrderSelect(k,SELECT_BY_POS)){
            if(OrderSymbol()==Symbol()){
            if( OrderMagicNumber()==MN_NeBuy )Opened_Buy++;}}}

//          Wenn weniger NextBuy als 1 offen sind, NextBuy-by-FirstSel öffnen.
            if( 1 > Opened_Buy ){
              if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots_Buy,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,clrBlue);
              if(IsTradeContextBusy()==true)Sleep(slMS);


              Print( "NextBuy-by-FirstSel:",
                   
                    "-OL()=",OrderLots(),
                    "-Lots_Multi=",Lots_Multi,
                    "-Lots_Buy=",Lots_Buy
                 
                  );


    }}}} }// Nach OS2/OC2 FirstSel über MN raus gesucht.

//-----------------------------------------------------------------------------------------------------------*/
}}}// Nach OC2 FirstSel und FirstBuy raus suchen. ( k )
//=============================================================================================================
// O P E N  M O R E  S E L  B Y  N E X T B U Y  ( k )
//=============================================================================================================


// Wenn nach OS3 (k) Next-NextBuy offen ist...
  if( neLO==true ){

//  ...berechnen, ob NextBuy unter DON_Sel ist:
    for(m=OrdersTotal()-1;m>=0;m--){
    if(OrderSelect(m,SELECT_BY_POS)){
    if(OrderSymbol()==Symbol()){
    if( OrderMagicNumber()==MN_NeBuy )DON_Sel=NormalizeDouble( OrderOpenPrice() - D_ONO *Point,Digits);}}}

//  Wenn letzter NextBuy unter DON_Sel ist...
    if( Bid < DON_Sel ){// ?

//    Wenn FirstSel über DCAO ist...
      if( Ask > DCAO_FiSel ){// ?


        L_LO=1.0;
        for(m=OrdersTotal()-1;m>=0;m--){
        if(OrderSelect(m,SELECT_BY_POS)){
        if(OrderSymbol()==Symbol()){
        if( OrderMagicNumber()==MN_NeBuy ){

          if( OrderLots() <  1.0 && L_LO < 1.0 )Lots_Sel = ( OrderLots() / L_LO ) * Lots_Multi;
          else Lots_Sel = OrderLots() * L_LO * Lots_Multi;

          L_LO = Lots_Sel;
         
          }}}}


        Opened_Buy=0;
        for(n=OrdersTotal()-1;n>=0;n--){
        if(OrderSelect(n,SELECT_BY_POS)){
        if(OrderSymbol()==Symbol()){
        if( OrderMagicNumber()==MN_NeBuy )Opened_Buy++;}}}

//      Ausrechnen, wie viele NextSel geöffnet werden müssen:
        Need_Sel = Opened_Buy + 1;

//      ...zählen, wie viele NextSel schon offen sind:
        Opened_Sel=0;
        for(o=OrdersTotal()-1;o>=0;o--){
        if(OrderSelect(o,SELECT_BY_POS)){
        if(OrderSymbol()==Symbol()){
        if( OrderMagicNumber()==MN_NeSel )Opened_Sel++;}}}

//      Wenn weniger NextSel als NeedSel offen sind, weitere NextSel öffnen:
        if( Need_Sel > Opened_Sel ){
          if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots_Sel,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,clrBlue);
          if(IsTradeContextBusy()==true)Sleep(slMS);


          Print("Next Sel:"
               
                "-Opened_Buy=",Opened_Buy,
                "-Need_Sel=",Need_Sel,
                "-Opened_Sel=",Opened_Sel,
               
               
                "-OL()=",OrderLots(),
                "-Lot_LO=",L_LO,
                "-Lots_Sel=",Lots_Sel
               
              );
               
         
          }}} }// Nach OS3 Next-NextBuy offen


//=============================================================================================================
// O P E N  M O R E  B U Y  B Y  N E X T S E L  ( k )
//=============================================================================================================


//  ...wenn nach OS3 NextSel offen ist...
    if(neSH==true){

//    ...prüfen, ob NeSel über DON_Buy ist:
      for(p=OrdersTotal()-1;p>=0;p--){
      if(OrderSelect(p,SELECT_BY_POS)){
      if(OrderSymbol()==Symbol()){
      if( OrderMagicNumber()==MN_NeSel )DON_Buy=NormalizeDouble( OrderOpenPrice() + D_ONO *Point,Digits);}}}

//    Wenn NextSel über DON_Buy ist...     
      if( Ask > DON_Buy ){// ?

//      ...prüfen, ob FirstBuy DCAO erreicht hat:
        if( Bid < DCAO_FiBuy ){// ?


          L_SH=1.0;
          for(m=OrdersTotal()-1;m>=0;m--){
          if(OrderSelect(m,SELECT_BY_POS)){
          if(OrderSymbol()==Symbol()){
          if( OrderMagicNumber()==MN_NeSel ){

            if( OrderLots() <  1.0 && L_SH < 1.0 )Lots_Buy = ( OrderLots() / L_SH ) * Lots_Multi;
            else Lots_Buy = OrderLots() * L_SH * Lots_Multi;

            L_SH = Lots_Buy;
           
            }}}}


//        Sel-Orders zählen:
          Opened_Sel=0;
          for(t=OrdersTotal()-1;t>=0;t--){
          if(OrderSelect(t,SELECT_BY_POS)){
          if(OrderSymbol()==Symbol()){
          if( OrderMagicNumber()==MN_NeSel )Opened_Sel++;}}}

//        Ausrechnen wie viele NextBuy geöffnet werden müssen...
          Need_Buy=Opened_Sel+1;

//        ...zählen, wie viele NextBuy schon offen sind:
          Opened_Buy=0;
          for(r=OrdersTotal()-1;r>=0;r--){
          if(OrderSelect(r,SELECT_BY_POS)){
          if(OrderSymbol()==Symbol()){
          if( OrderMagicNumber()==MN_NeBuy )Opened_Buy++;}}}

//        Wenn weniger NextBuy als NeedBuy offen sind, weitere NextBuy öffnen:
          if( Need_Buy > Opened_Buy ){
            if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots_Buy,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,clrBlue);
            if(IsTradeContextBusy()==true)Sleep(slMS);


          Print("Next Buy:"
             
                "-OL()=",OrderLots(),
                "-L_SH=",L_SH,
                "-Lots_Buy=",Lots_Buy,
               
                "-Opened_Sel=",Opened_Sel,
                "-Need_Buy=",Need_Buy,
                "-Opened_Buy=",Opened_Buy
               
              );
         
         
          }}} }// nach OS3 Next-NextSel offen.


//=============================================================================================================
// N A C H  O C 2  F I R S T - S E L  U N D  F I R S T B U Y  O F F E N
//=============================================================================================================
}// Nach OC2 FirstSel und FirstBuy offen.
//=============================================================================================================
// C L O S E  A L L  B Y  F I R S T  O R D E R S
//=============================================================================================================
//Wenn FirstSel unter DCAO / FirstBuy über DCAO ist, alle Orders schließen.
if( Ask <= DCAO_FiSel || Bid >= DCAO_FiBuy ){// ?
  for(z=OrdersTotal()-1;z>=0;z--){
  if(OrderSelect(z,SELECT_BY_POS)){
  if(OrderSymbol()==Symbol()){
    if(OrderMagicNumber()==MN_NeSel||OrderMagicNumber()==MN_FiSel){
      if(IsTradeAllowed()==true)OC_Sel=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrRed);
      if(IsTradeContextBusy()==true)Sleep(slMS);}
    if(OrderMagicNumber()==MN_NeBuy||OrderMagicNumber()==MN_FiBuy){
      if(IsTradeAllowed()==true)OC_Buy=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrRed);
      if(IsTradeContextBusy()==true)Sleep(slMS);}}}} }// FirstSel/FirstBuy hat DCAO-Dist erreicht.
//=============================================================================================================
// E A  F U N K T I O N E N  B E E N D E N
//=============================================================================================================
}// void OnTick()


MA-EA 25.11.21 15:07

Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.

Ist jetzt nicht gerade nen Rekord-Gewinn unten rechts, aber grundsätzlich kann man wohl Profit damit machen. Wenn der EA immer gut läuft, kann man immer wieder kleine Gewinne machen bei im Grunde Null Risiko.

Allerdings gibts da noch einige Unklarheiten.

Die Lotsize soll mit jeder Order sozusagen exponentiert werden oder wie man das nennt. Also OrderLots() einer Order * OrderLots() der nächsten Order * einen einstellbaren Multiplikator (Oder wie man das nennt :rolleyes: ) Sorry, bin in Mathe ne echte Pfeife.

Ausserdem ist nicht ganz klar, wie man dem EA klar machen soll, wie er erkennt, wann er wie viele weitere Orders in eine Richtung öffnen soll, bzw. wie er berechnen soll, obs eine weitere Order braucht oder gar keine. Sonst öffnet er mal 2 Neue, mal 5, mal gar keine. Da steh ich auf dem Schlauch. :confused:

Der komplette Code ist im Anhang.

https://charts.mql5.com/30/756/eurus...trades-plc.png

traderdoc 25.11.21 16:21

Zitat:

Zitat von MA-EA (Beitrag 45818)
Hallo.
... kann man immer wieder kleine Gewinne machen bei im Grunde Null Risiko.
Allerdings gibts da noch einige Unklarheiten.

Ausserdem ist nicht ganz klar, wie man dem EA klar machen soll, wie er erkennt, wann er wie viele weitere Orders in eine Richtung öffnen soll, bzw. wie er berechnen soll, obs eine weitere Order braucht oder gar keine. Sonst öffnet er mal 2 Neue, mal 5, mal gar keine. Da steh ich auf dem Schlauch. :confused:
https://charts.mql5.com/30/756/eurus...trades-plc.png

Ne, aber ansonsten ist alles klar.

traderdoc

MA-EA 27.11.21 12:54

Liste der Anhänge anzeigen (Anzahl: 1)
Wie jetzt "Alles klar" ? :confused:

Irgendwie ist Einiges gar nicht klar. :rolleyes:

Im Anhang die neueste Version. Hoffe mal, die macht einigermaßen was sie soll. Oder zumindest besser als die Vers. davor. :rolleyes:

Hab nichts gegen Tipps zur Verbesserung / Optimierung. ;)

Code:

/*=============================================================================================================
// N O T I Z E N  U N D  I N F O S
//=============================================================================================================

Anscheinend muss DONO mehr als doppelt so groß wie Spread sein,
weil sonst nicht alle Spread-Kosten wieder rein kommen?


//-------------------------------------------------------------------------------------------------------------

In dieser Vers. LoShAL_v5_PRINT.mq4 gibt es 3 OS.

//-------------------------------------------------------------------------------------------------------------


//=============================================================================================================
// P R O P E R T Y
//============================================================================================================*/
//#property strict
//#ps sorgt anscheinend dafür, dass Kommentare im Konfig-Fenster im MT4 sichtbar sind.
#property copyright"LoShAL_v5_PRINT.mq4"
#property copyright"daniel-rudloff@web.de"
//=============================================================================================================
// B E S C H R E I B U N G
//=============================================================================================================
extern string esTOY="true  = on / yes";
extern string esFON="false = off / no";
//-----------------------------------------------------------------------------------------------------------*/
extern string esB01="Open 1.Sel & 1.Buy.";
extern string esB02="if last Sel >";
extern string esB03="( OrderOpenPrice()";
extern string esB04="+ Dist_ONO )";
extern string esB05="EA multi LotsBuy.";
extern string esB06="If 1.Sel <";
extern string esB07="( OrderOpenPrice()";
extern string esB08="- D_CAO )";
extern string esB09="EA close all Orders.";
extern string esB10="if last Buy <";
extern string esB11="( OrderOpenPrice()";
extern string esB12="- Dist_ONO )";
extern string esB13="EA multi LotsSel.";
extern string esB14="If 1.Buy >";
extern string esB15="( OrderOpenPrice()";
extern string esB16="+ D_CAO )";
extern string esB17="EA close all Orders.";
//=============================================================================================================
// E I N S T E L L U N G E N
//=============================================================================================================
extern string esMN="Magic Numbers";
extern int MN_FiSel=12;
extern int MN_FiBuy=34;
extern int MN_NeSel=56;
extern int MN_NeBuy=78;
//-----------------------------------------------------------------------------------------------------------*/
extern string esOOFT1="Open Orders";
extern string esOOFT2="from/till Hour";
extern string esOOFT3="(Server Time)";
extern int FromH=5;//  Vor 5 Uhr starten scheint sich nicht zu lohnen.
extern int TillH=16;// Zum Testen bis einschließlich 16 Uhr öffnen.
//-----------------------------------------------------------------------------------------------------------*/
extern string esTF="TimeFrame";
input ENUM_TIMEFRAMES TF=1;// Zum Testen M1
//-----------------------------------------------------------------------------------------------------------*/
extern int Slippage=12345;
//-----------------------------------------------------------------------------------------------------------*/
extern int SL=225;// ?
//-----------------------------------------------------------------------------------------------------------*/
extern int TP=200;// ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esIITCBSMS1="if IsTradeContexBusy()";
extern string esIITCBSMS2="sleep MS";
extern int slMS=40;// Zum Testen 40ms ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esDOONO1="Dist to OrderOpenPrice()";
extern string esDOONO2="open next Order";
extern int D_ONO=34;// Zum Testen 34
//-----------------------------------------------------------------------------------------------------------*/
extern string esDCAO1="Dist to OrderOpenPrice()";
extern string esDCAO2="close all Orders";
extern int D_CAO=67;// Zum Testen 67
//-----------------------------------------------------------------------------------------------------------*/

extern string esL="Lots";
extern double Lots=0.01;
extern int Lots_Multi=3;// Zum Testen 3

//-----------------------------------------------------------------------------------------------------------*/

//=============================================================================================================
// G L O B A L E  D E K L A R A T I O N E N
//=============================================================================================================
bool

fiLO,fiSH,neLO,neSH,OC_Sel,OC_Buy

;
//-----------------------------------------------------------------------------------------------------------*/
double

SL_Sel,SL_Buy,TP_Sel,TP_Buy,MSL,
DON_Sel,DON_Buy,DCAO_FiSel,DCAO_FiBuy,
Lots_Sel,Lots_Buy,

OL,L_LO,L_SH

;
//-----------------------------------------------------------------------------------------------------------*/
int

i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,// ?
TI_FiSel,TI_FiBuy,TI_NeSel,TI_NeBuy,
Opened_Sel,Opened_Buy,Need_Sel,Need_Buy

;
//=============================================================================================================
// I N I T
//=============================================================================================================
void OnInit(){ChartSetSymbolPeriod(0,NULL,TF);}
//=============================================================================================================
// E A  F U N K T I O N E N  S T A R T
//=============================================================================================================
void OnTick(){
//=============================================================================================================
// S T O P  L O S S
//=============================================================================================================
//SL auf 0 stellen, wenn oben <1, um irgendwelche Missverständnisse zu vermeiden.
if(SL<1){
SL_Sel=0.0;
SL_Buy=0.0;}
if(SL>0){
SL_Sel=NormalizeDouble(Bid+SL*Point,Digits);
SL_Buy=NormalizeDouble(Ask-SL*Point,Digits);}
//=============================================================================================================
// T A K E  P R O F I T
//=============================================================================================================
//TP auf 0 stellen, wenn oben <1, um irgendwelche Missverständnisse zu vermeiden.
if(TP<1){
TP_Sel=0.0;
TP_Buy=0.0;}
if(TP>0){
TP_Sel=NormalizeDouble(Bid-TP*Point,Digits);
TP_Buy=NormalizeDouble(Ask+TP*Point,Digits);}
//=============================================================================================================
// L O T S
//=============================================================================================================


  double mL,oLmL,Mr,MmL;

  mL = MarketInfo(Symbol(),MODE_MINLOT);
  Mr = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 


//=============================================================================================================
// O R D E R  S E A R C H  1  ( i )
//=============================================================================================================
fiLO=false;
fiSH=false;
neLO=false;
neSH=false;
for(i=OrdersTotal()-1;i>=0;i--){
if(OrderSelect(i,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FiBuy)fiLO=true;
if(OrderMagicNumber()==MN_FiSel)fiSH=true;
if(OrderMagicNumber()==MN_NeBuy)neLO=true;
if(OrderMagicNumber()==MN_NeSel)neSH=true;}}}
//=============================================================================================================
// O R D E R  C H E C K  1
//=============================================================================================================
//Wenn nach OS1 gar keine Orders offen sind...
if(fiSH==false&&fiLO==false&&neSH==false&&neLO==false){
//=============================================================================================================
// ( O C 1 )  O P E N  F I R S T  S E L / O P E N  F I R S T  B U Y
//=============================================================================================================
//...und wenn zur Zeit Orders geöffnet werden dürfen, FirstSel und FirstBuy öffnen.
  if(Hour()>=FromH&&Hour()<=TillH){
    if(IsTradeAllowed())TI_FiSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_FiSel,clrBlue);
    if(IsTradeContextBusy())Sleep(slMS);
    if(IsTradeAllowed())TI_FiBuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_FiBuy,clrBlue);
    if(IsTradeContextBusy())Sleep(slMS);}}// Nach OC1 gar keine Orders offen.
//=============================================================================================================
// O R D E R  S E A R C H  2  ( j )
//=============================================================================================================
for(j=OrdersTotal()-1;j>=0;j--){
if(OrderSelect(j,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FiBuy)fiLO=true;
if(OrderMagicNumber()==MN_FiSel)fiSH=true;
if(OrderMagicNumber()==MN_NeBuy)neLO=true;
if(OrderMagicNumber()==MN_NeSel)neSH=true;}}}
//=============================================================================================================
// O R D E R  C H E C K  2
//=============================================================================================================
// Wenn nach OS2/OC2 FirstBuy und FirstSel offen sind...
if( fiLO==true && fiSH==true ){// ?
//=============================================================================================================
// ( O S 2 )  D C A O - B E R E C H N U N G E N
//=============================================================================================================
  for(k=OrdersTotal()-1;k>=0;k--){
  if(OrderSelect(k,SELECT_BY_POS)){
  if(OrderSymbol()==Symbol()){
    if(OrderMagicNumber()==MN_FiBuy)DCAO_FiBuy=NormalizeDouble( OrderOpenPrice() + D_CAO *Point,Digits);
    if(OrderMagicNumber()==MN_FiSel)DCAO_FiSel=NormalizeDouble( OrderOpenPrice() - D_CAO *Point,Digits);}}}
//=============================================================================================================
// O R D E R  S E A R C H  3  ( k )
//=============================================================================================================
for(k=OrdersTotal()-1;k>=0;k--){
if(OrderSelect(k,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_NeBuy)neLO=true;
if(OrderMagicNumber()==MN_NeSel)neSH=true;}}}
//=============================================================================================================
// ( O S 3 )  O P E N  N E X T S E L  B Y  F I R S T B U Y
//=============================================================================================================

//...wenn nach OS3 (k) noch kein NextBuy offen ist...
  if( neLO==false ){

//  ...FirstBuy raus suchen:
    for(l=OrdersTotal()-1;l>=0;l--){
    if(OrderSelect(l,SELECT_BY_POS)){
    if(OrderSymbol()==Symbol()){

      if( OrderMagicNumber()==MN_FiBuy ){

//      ...DON_Sel berechnen:
        DON_Sel=NormalizeDouble( OrderOpenPrice() - D_ONO *Point,Digits);

//      Lots für NextSel-By-FirstBuy berechnen:
        Lots_Sel = OrderLots() * Lots_Multi;}}}}

 
//Wenn FirstBuy unter DON-Sel ist...
  if( Bid < DON_Sel ){// ?

//  Wenn FirstSel über DCAO ist...
    if( Ask > DCAO_FiSel ){// ?
     
//   
      OL=0.0;
      for(l=OrdersTotal()-1;l>=0;l--){
      if(OrderSelect(l,SELECT_BY_POS)){
      if(OrderSymbol()==Symbol()){
      if(OrderMagicNumber()==MN_NeSel){
     
        if( OrderLots() > OL )OL = OrderLots();
     
      }}}}

//    Wenn weniger NextSel als 1 offen sind, NextSel-by-firstBuy öffnen:
      if( Lots_Sel > OL ){
        if(IsTradeAllowed())TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots_Sel,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,clrBlue);
        if(IsTradeContextBusy())Sleep(slMS);


        Print( "NextSel-by-FirstBuy:",

              "-OL()=",OrderLots(),
              "-Lots_Multi=",Lots_Multi,
              "-Lots_Sel=",Lots_Sel,
             
              "-DCAO_FiBuy=",DCAO_FiBuy,
              "-DCAO_FiSel=",DCAO_FiSel
                 
            );


  }}} }// Nach OC2 noch kein NextBuy offen.

//=============================================================================================================
//( O S 3 )  O P E N  N E X T B U Y  B Y  F I R S T S E L
//=============================================================================================================

//Wenn nach OS3 noch kein NextSel offen ist...
  if( neSH==false ){

//  ...FirstSel raus suchen:
    for(l=OrdersTotal()-1;l>=0;l--){
    if(OrderSelect(l,SELECT_BY_POS)){
    if(OrderSymbol()==Symbol()){

      if( OrderMagicNumber()==MN_FiSel ){

//      DON-Buy für FirstSel ausrechnen...
        DON_Buy=NormalizeDouble( OrderOpenPrice() + D_ONO *Point,Digits);

        Lots_Buy = OrderLots() * Lots_Multi;}}}}


//  Wenn FirstSel über DON_Buy ist...
    if( Ask > DON_Buy ){// ?
       
//    ...wenn FirstBuy unter DCAO ist:
      if( Bid < DCAO_FiBuy ){// ?

//      Zählen, wie viele NextBuy-by-FirstSel bereits offen sind:
        OL=0.0;
        for(m=OrdersTotal()-1;m>=0;m--){
        if(OrderSelect(m,SELECT_BY_POS)){
        if(OrderSymbol()==Symbol()){
        if(OrderMagicNumber()==MN_NeBuy){
       
          if( OrderLots() > OL )OL = OrderLots();
       
        }}}}


        if( Lots_Buy > OL ){
          if(IsTradeAllowed())TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots_Buy,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,clrBlue);
          if(IsTradeContextBusy())Sleep(slMS);


          Print( "NextBuy-by-FirstSel:",
                   
                "-OL()=",OrderLots(),
                "-Lots_Multi=",Lots_Multi,
                "-Lots_Buy=",Lots_Buy,
               
                "-DCAO_FiBuy=",DCAO_FiBuy,
                "-DCAO_FiSel=",DCAO_FiSel
                 
              );


    }}} }// Nach OS3 noch kein NextSel offen.

//=============================================================================================================
// ( O S 3 ) O P E N  M O R E  S E L  B Y  N E X T B U Y
//=============================================================================================================

// Wenn nach OS4 doch Next-NextBuy offen ist...
  if( neLO==true ){

//  ...berechnen, ob NextBuy unter DON_Sel ist:
    for(m=OrdersTotal()-1;m>=0;m--){
    if(OrderSelect(m,SELECT_BY_POS)){
    if(OrderSymbol()==Symbol()){
    if( OrderMagicNumber()==MN_NeBuy ){
    DON_Sel=NormalizeDouble( OrderOpenPrice() - D_ONO *Point,Digits);}}}}


//  Wenn letzter NextBuy unter DON_Sel ist...
    if( Bid < DON_Sel ){// ?

//    Wenn FirstSel über DCAO ist...
      if( Ask > DCAO_FiSel ){// ?


//      ...Lots für NextSel-by-NextBuy berechnen
        L_LO=1.0;
        for(m=OrdersTotal()-1;m>=0;m--){
        if(OrderSelect(m,SELECT_BY_POS)){
        if(OrderSymbol()==Symbol()){
        if( OrderMagicNumber()==MN_FiBuy || OrderMagicNumber()==MN_NeBuy ){

          Lots_Sel = L_LO * OrderLots() * Lots_Multi;

          L_LO = Lots_Sel;
         
         
          Print("Lots NextSel:",
         
                "-L_LO=",L_LO,
                "-OL()=",OrderLots(),
                "-Lots_Sel=",Lots_Sel,
               
                "-DCAO_FiBuy=",DCAO_FiBuy,
                "-DCAO_FiSel=",DCAO_FiSel
             
              );
        }}}}


//      ...Prüfen, ob schon NextSel mit letztem Lots_Sel-Ergebnis geöffnet wurde:
        OL=0.0;
        for(n=OrdersTotal()-1;n>=0;n--){
        if(OrderSelect(n,SELECT_BY_POS)){
        if(OrderSymbol()==Symbol()){
        if( OrderMagicNumber()==MN_NeSel ){
       
          if( OrderLots() > OL )OL = OrderLots();
       
        }}}}


//      Wenn ... , weitere NextSel öffnen:
        if( Lots_Sel > OL ){
          if(IsTradeAllowed())TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots_Sel,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,clrBlue);
          if(IsTradeContextBusy())Sleep(slMS);


          Print("Next Sel:"
               
                "-OL()=",OrderLots(),
                "-Lot_LO=",L_LO,
                "-Lots_Sel=",Lots_Sel,
               
                "-DCAO_FiBuy=",DCAO_FiBuy,
                "-DCAO_FiSel=",DCAO_FiSel
               
              );
               
         
          }}} }// Nach OS3 Next-NextBuy offen

//=============================================================================================================
// ( O S 3 )  O P E N  M O R E  B U Y  B Y  N E X T S E L
//=============================================================================================================

//  ...wenn nach OS3 doch NextSel offen ist...
    if( neSH==true ){

//    ...prüfen, ob NeSel über DON_Buy ist:
      for(p=OrdersTotal()-1;p>=0;p--){
      if(OrderSelect(p,SELECT_BY_POS)){
      if(OrderSymbol()==Symbol()){
      if( OrderMagicNumber()==MN_NeSel ){
      DON_Buy=NormalizeDouble( OrderOpenPrice() + D_ONO *Point,Digits);}}}}


//    Wenn NextSel über DON_Buy ist...     
      if( Ask > DON_Buy ){// ?

//      ...prüfen, ob FirstBuy DCAO erreicht hat:
        if( Bid < DCAO_FiBuy ){// ?


          L_SH=1.0;
          for(m=OrdersTotal()-1;m>=0;m--){
          if(OrderSelect(m,SELECT_BY_POS)){
          if(OrderSymbol()==Symbol()){
          if( OrderMagicNumber()==MN_FiSel || OrderMagicNumber()==MN_NeSel ){

            Lots_Buy = L_SH * OrderLots() * Lots_Multi;

            L_SH = Lots_Buy;
           
           
            Print( "Lots NextBuy:",
             
                  "-OL()=",OrderLots(),
                  "-L_SH=",L_SH,
                  "-Lots_Buy=",Lots_Buy
             
                );
           
          }}}}


//      ...Prüfen, ob schon NextBuy mit letztem Lots_Buy-Ergebnis geöffnet wurde:
        OL=0.0;
        for(n=OrdersTotal()-1;n>=0;n--){
        if(OrderSelect(n,SELECT_BY_POS)){
        if(OrderSymbol()==Symbol()){
        if( OrderMagicNumber()==MN_NeBuy ){
       
          if( OrderLots() > OL )OL = OrderLots();
       
        }}}}


//        Wenn ... , weitere NextBuy öffnen:
          if( Lots_Buy > OL ){
            if(IsTradeAllowed())TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots_Buy,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,clrBlue);
            if(IsTradeContextBusy())Sleep(slMS);


            Print("Next Buy:"
             
                  "-OL()=",OrderLots(),
                  "-L_SH=",L_SH,
                  "-Lots_Buy=",Lots_Buy,
                 
                  "-DCAO_FiBuy=",DCAO_FiBuy,
                  "-DCAO_FiSel=",DCAO_FiSel
               
                );
         
         
          }}} }// nach OS3 Next-NextSel offen.

//=============================================================================================================
// N A C H  O S 2  F I R S T - S E L  U N D  F I R S T B U Y  O F F E N
//=============================================================================================================
}// Nach OS2 FirstSel und FirstBuy offen.
//=============================================================================================================
// C L O S E  A L L  B Y  F I R S T  O R D E R S
//=============================================================================================================
//Wenn FirstSel unter DCAO / FirstBuy über DCAO ist, alle Orders schließen.
if( Ask < DCAO_FiSel || Bid > DCAO_FiBuy ){// ?
  for(z=OrdersTotal()-1;z>=0;z--){
  if(OrderSelect(z,SELECT_BY_POS)){
  if(OrderSymbol()==Symbol()){
    if(OrderMagicNumber()==MN_NeSel||OrderMagicNumber()==MN_FiSel){
      if(IsTradeAllowed())OC_Sel=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrRed);
      if(IsTradeContextBusy())Sleep(slMS);}
    if(OrderMagicNumber()==MN_NeBuy||OrderMagicNumber()==MN_FiBuy){
      if(IsTradeAllowed())OC_Buy=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrRed);
      if(IsTradeContextBusy())Sleep(slMS);}}}} }// FirstSel/FirstBuy hat DCAO-Dist erreicht.
//=============================================================================================================
// E A  F U N K T I O N E N  B E E N D E N
//=============================================================================================================
}// void OnTick()


traderdoc 27.11.21 19:33

Zitat:

Zitat von MA-EA (Beitrag 45825)
Wie jetzt "Alles klar" ? :confused:

Irgendwie ist Einiges gar nicht klar. :rolleyes:

[/CODE]

Na ja, das sage ich doch.

traderdoc

MA-EA 27.11.21 22:21

https://www.mathelounge.de/4250/waru...und-nicht-0-04

Vermutlich ist das das Problem. Wenn man Lot-Werte, die beide kleiner als 1 sind, miteinander multiplizieren will. Z.B. 0.02 Lot * 0.02 Lot. Da kommen ganz andere Werte raus als eigentlich sollen. Mein Handy rechnet solche Werte anscheinend so, wie es soll. Der PC aber nicht. Gibts da ne einigermaßen einfache Lösung für? :confused:

traderdoc 27.11.21 23:26

Zitat:

Zitat von MA-EA (Beitrag 45827)
https://www.mathelounge.de/4250/waru...und-nicht-0-04

Vermutlich ist das das Problem. Wenn man Lot-Werte, die beide kleiner als 1 sind, miteinander multiplizieren will. Z.B. 0.02 Lot * 0.02 Lot. Da kommen ganz andere Werte raus als eigentlich sollen. Mein Handy rechnet solche Werte anscheinend so, wie es soll. Der PC aber nicht. Gibts da ne einigermaßen einfache Lösung für? :confused:

Ja einfach 0.02 * 0.02 rechnen lassen.
Hoffentlich kommt da so etwa 0 raus.

traderdoc

MA-EA 28.11.21 16:55

Liste der Anhänge anzeigen (Anzahl: 1)
Da kommt 0,0004 raus. Das wären für den MT4 dann 0.00 Lot. :confused:

Die Lösung ist anscheinend, das Ergebnis noch mal mit 100 zu multiplizieren. Aber was, wenn MinLot() 0.1 ist? Derzeit rechnet der EA einfach 1.0 / MinLot(). Das Ergebnis dann mal die andere Lot-Berechnerei. Jedenfalls wenn beide Werte, die miteinander multipliziert werden sollen, < 1.0 sind. Das scheint soweit auch zu funktionieren.

MA-EA 28.11.21 22:57

Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.

Im Anhang die neueste Version. Keine Ahnung ob das Teil so funktioniert. Müsste eigentlich. Das hab ich aber schon oft gedacht. :rolleyes:

Wär cool, wenn Jemand Tipps zur Optimierung hätte. Oder allgemein Tipps und Hinweise usw. zu MartinGale-EAs und Strategien.

Code:

/*=============================================================================================================
// N O T I Z E N  U N D  I N F O S
//=============================================================================================================

Anscheinend muss DONO mehr als doppelt so groß wie Spread sein,
weil sonst nicht alle Spread-Kosten wieder rein kommen?


//-------------------------------------------------------------------------------------------------------------

In dieser Vers. LoShAL_Ti_v1_PRINT.mq4 gibt es 4 OS.

//-------------------------------------------------------------------------------------------------------------


//=============================================================================================================
// P R O P E R T Y
//============================================================================================================*/
//#property strict
//#ps sorgt anscheinend dafür, dass Kommentare im Konfig-Fenster im MT4 sichtbar sind.
#property copyright"LoShAL_Ti_v1_PRINT.mq4"
#property copyright"daniel-rudloff@web.de"
//=============================================================================================================
// B E S C H R E I B U N G
//=============================================================================================================
extern string esTOY="true  = on / yes";
extern string esFON="false = off / no";
//-----------------------------------------------------------------------------------------------------------*/
extern string esB01="Open 1.Sel & 1.Buy.";
extern string esB02="if last Sel >";
extern string esB03="( OrderOpenPrice()";
extern string esB04="+ Dist_ONO )";
extern string esB05="EA multi LotsBuy.";
extern string esB06="If 1.Sel <";
extern string esB07="( OrderOpenPrice()";
extern string esB08="- D_CAO )";
extern string esB09="EA close all Orders.";
extern string esB10="if last Buy <";
extern string esB11="( OrderOpenPrice()";
extern string esB12="- Dist_ONO )";
extern string esB13="EA multi LotsSel.";
extern string esB14="If 1.Buy >";
extern string esB15="( OrderOpenPrice()";
extern string esB16="+ D_CAO )";
extern string esB17="EA close all Orders.";
//=============================================================================================================
// E I N S T E L L U N G E N
//=============================================================================================================
extern string esMN="Magic Numbers";
extern int MN_FiSel=12;
extern int MN_FiBuy=34;
extern int MN_NeSel=56;
extern int MN_NeBuy=78;
//-----------------------------------------------------------------------------------------------------------*/
extern string esOOFT1="Open Orders";
extern string esOOFT2="from/till Hour";
extern string esOOFT3="(Server Time)";
extern int FromH=5;//  Vor 5 Uhr starten scheint sich nicht zu lohnen.
extern int TillH=16;// Zum Testen bis einschließlich 16 Uhr öffnen.
//-----------------------------------------------------------------------------------------------------------*/
extern string esTF="TimeFrame";
input ENUM_TIMEFRAMES TF=1;// Zum Testen M1
//-----------------------------------------------------------------------------------------------------------*/
extern int Slippage=12345;
//-----------------------------------------------------------------------------------------------------------*/
extern int SL=255;// ?
//-----------------------------------------------------------------------------------------------------------*/
extern int TP=200;// ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esIITCBSMS1="if IsTradeContexBusy()";
extern string esIITCBSMS2="sleep MS";
extern int slMS=40;// Zum Testen 40ms ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esDOONO1="Dist to OrderOpenPrice()";
extern string esDOONO2="open next Order";
extern int D_ONO=34;// Zum Testen 34
//-----------------------------------------------------------------------------------------------------------*/
extern string esDCAO1="Dist to OrderOpenPrice()";
extern string esDCAO2="close all Orders";
extern int D_CAO=68;// Zum Testen 68
//-----------------------------------------------------------------------------------------------------------*/

extern string esL="Lots";
extern double Lots=0.01;
extern double Lots_Multi=2.0;// Zum Testen 2.0

//-----------------------------------------------------------------------------------------------------------*/

//=============================================================================================================
// G L O B A L E  D E K L A R A T I O N E N
//=============================================================================================================
bool

fiLO,fiSH,neLO,neSH,OC_Sel,OC_Buy

;
//-----------------------------------------------------------------------------------------------------------*/
double

SL_Sel,SL_Buy,TP_Sel,TP_Buy,MSL,
DON_Sel,DON_Buy,DCAO_FiSel,DCAO_FiBuy,
Lots_Sel,Lots_Buy,

OdML,

OL,L_LO,L_SH

;
//-----------------------------------------------------------------------------------------------------------*/
int

i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,// ?
TI_FiSel,TI_FiBuy,TI_NeSel,TI_NeBuy,
Opened_Sel,Opened_Buy,Need_Sel,Need_Buy

;
//=============================================================================================================
// I N I T
//=============================================================================================================
void OnInit(){ChartSetSymbolPeriod(0,NULL,TF);}
//=============================================================================================================
// E A  F U N K T I O N E N  S T A R T
//=============================================================================================================
void OnTick(){
//=============================================================================================================
// S T O P  L O S S
//=============================================================================================================
//SL auf 0 stellen, wenn oben <1, um irgendwelche Missverständnisse zu vermeiden.
if(SL<1){
SL_Sel=0.0;
SL_Buy=0.0;}
if(SL>0){
SL_Sel=NormalizeDouble(Bid+SL*Point,Digits);
SL_Buy=NormalizeDouble(Ask-SL*Point,Digits);}
//=============================================================================================================
// T A K E  P R O F I T
//=============================================================================================================
//TP auf 0 stellen, wenn oben <1, um irgendwelche Missverständnisse zu vermeiden.
if(TP<1){
TP_Sel=0.0;
TP_Buy=0.0;}
if(TP>0){
TP_Sel=NormalizeDouble(Bid-TP*Point,Digits);
TP_Buy=NormalizeDouble(Ask+TP*Point,Digits);}
//=============================================================================================================
// L O T S
//=============================================================================================================


  double mL,oLmL,Mr,MmL;

  mL = MarketInfo(Symbol(),MODE_MINLOT);
  Mr = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 
 
  OdML = 1.0 / mL;
 


//=============================================================================================================
// O R D E R  S E A R C H  1  ( i )
//=============================================================================================================
fiLO=false;
fiSH=false;
neLO=false;
neSH=false;
for(i=OrdersTotal()-1;i>=0;i--){
if(OrderSelect(i,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FiBuy)fiLO=true;
if(OrderMagicNumber()==MN_FiSel)fiSH=true;
if(OrderMagicNumber()==MN_NeBuy)neLO=true;
if(OrderMagicNumber()==MN_NeSel)neSH=true;}}}
//=============================================================================================================
// O R D E R  C H E C K  1
//=============================================================================================================
//Wenn nach OS1 gar keine Orders offen sind...
if(fiSH==false&&fiLO==false&&neSH==false&&neLO==false){
//=============================================================================================================
// ( O C 1 )  O P E N  F I R S T  S E L / O P E N  F I R S T  B U Y
//=============================================================================================================
//...und wenn zur Zeit Orders geöffnet werden dürfen, FirstSel und FirstBuy öffnen.
  if(Hour()>=FromH&&Hour()<=TillH){
    if(IsTradeAllowed())TI_FiSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_FiSel,clrBlue);
    if(IsTradeContextBusy())Sleep(slMS);
    if(IsTradeAllowed())TI_FiBuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_FiBuy,clrBlue);
    if(IsTradeContextBusy())Sleep(slMS);}}// Nach OC1 gar keine Orders offen.
//=============================================================================================================
// O R D E R  S E A R C H  2  ( j )
//=============================================================================================================
for(j=OrdersTotal()-1;j>=0;j--){
if(OrderSelect(j,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FiBuy)fiLO=true;
if(OrderMagicNumber()==MN_FiSel)fiSH=true;
if(OrderMagicNumber()==MN_NeBuy)neLO=true;
if(OrderMagicNumber()==MN_NeSel)neSH=true;}}}
//=============================================================================================================
// O R D E R  C H E C K  2
//=============================================================================================================
// Wenn nach OS2/OC2 FirstBuy und FirstSel offen sind...
if( fiLO==true && fiSH==true ){// ?
//=============================================================================================================
// ( O S 2 )  D C A O - B E R E C H N U N G E N
//=============================================================================================================
  for(k=OrdersTotal()-1;k>=0;k--){
  if(OrderSelect(k,SELECT_BY_POS)){
  if(OrderSymbol()==Symbol()){
    if(OrderMagicNumber()==MN_FiBuy)DCAO_FiBuy=NormalizeDouble( OrderOpenPrice() + D_CAO *Point,Digits);
    if(OrderMagicNumber()==MN_FiSel)DCAO_FiSel=NormalizeDouble( OrderOpenPrice() - D_CAO *Point,Digits);}}}
//=============================================================================================================
// O R D E R  S E A R C H  3  ( k )
//=============================================================================================================
for(k=OrdersTotal()-1;k>=0;k--){
if(OrderSelect(k,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_NeBuy)neLO=true;
if(OrderMagicNumber()==MN_NeSel)neSH=true;}}}
//=============================================================================================================
// ( O S 3 )  O P E N  N E X T S E L  B Y  F I R S T B U Y
//=============================================================================================================

//...wenn nach OS3 (k) noch kein NextBuy offen ist...
  if( neLO==false ){

//  ...FirstBuy raus suchen:
    for(l=OrdersTotal()-1;l>=0;l--){
    if(OrderSelect(l,SELECT_BY_POS)){
    if(OrderSymbol()==Symbol()){
   
      if( OrderMagicNumber()==MN_FiBuy ){

//      ...DON_Sel berechnen:
        DON_Sel=NormalizeDouble( OrderOpenPrice() - D_ONO *Point,Digits);

//      Lots für NextSel-By-FirstBuy berechnen:
        Lots_Sel = OrderLots() * Lots_Multi;}}}}

 
//Wenn FirstBuy unter DON-Sel ist...
  if( Bid < DON_Sel ){// ?


//  Wenn FirstSel über DCAO ist...
    if( Ask > DCAO_FiSel ){// ?
     
//   
      OL=0.0;
      for(l=OrdersTotal()-1;l>=0;l--){
      if(OrderSelect(l,SELECT_BY_POS)){
      if(OrderSymbol()==Symbol()){
      if(OrderMagicNumber()==MN_NeSel){
     
        if( OrderLots() > OL )OL = OrderLots();
     
      }}}}


//    Wenn noch kein NextSel mit Lots_NextSel-Ergebnis offen ist, NextSel-by-firstBuy öffnen:
      if( Lots_Sel > OL ){
        if(IsTradeAllowed())TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots_Sel,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,clrBlue);
        if(IsTradeContextBusy())Sleep(slMS);


        Print( "NextSel-by-FirstBuy:",

              "-Lots_Multi=",Lots_Multi,
              "-Lots_Sel=",Lots_Sel,
             
              "-OL=",OL
                 
            );


  }}} }// Nach OC2 noch kein NextBuy offen.

//=============================================================================================================
//( O S 3 )  O P E N  N E X T B U Y  B Y  F I R S T S E L
//=============================================================================================================

//Wenn nach OS3 noch kein NextSel offen ist...
  if( neSH==false ){

//  ...FirstSel raus suchen:
    for(l=OrdersTotal()-1;l>=0;l--){
    if(OrderSelect(l,SELECT_BY_POS)){
    if(OrderSymbol()==Symbol()){

      if( OrderMagicNumber()==MN_FiSel ){

//      DON-Buy für FirstSel ausrechnen...
        DON_Buy=NormalizeDouble( OrderOpenPrice() + D_ONO *Point,Digits);

        Lots_Buy = OrderLots() * Lots_Multi;}}}}


//  Wenn FirstSel über DON_Buy ist...
    if( Ask > DON_Buy ){// ?
       
//    ...wenn FirstBuy unter DCAO ist:
      if( Bid < DCAO_FiBuy ){// ?


//     
        OL=0.0;
        for(m=OrdersTotal()-1;m>=0;m--){
        if(OrderSelect(m,SELECT_BY_POS)){
        if(OrderSymbol()==Symbol()){
        if(OrderMagicNumber()==MN_NeBuy){
       
          if( OrderLots() > OL )OL = OrderLots();
       
        }}}}


        if( Lots_Buy > OL ){
          if(IsTradeAllowed())TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots_Buy,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,clrBlue);
          if(IsTradeContextBusy())Sleep(slMS);


          Print( "NextBuy-by-FirstSel:",
                   
                "-Lots_Multi=",Lots_Multi,
                "-Lots_Buy=",Lots_Buy,
               
                "-OL=",OL

                 
              );


    }}} }// Nach OS3 noch kein NextSel offen.
   
//=============================================================================================================
// O R D E R  S E A R C H  4  ( l )
//=============================================================================================================
for(l=OrdersTotal()-1;l>=0;l--){
if(OrderSelect(l,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_NeBuy)neLO=true;
if(OrderMagicNumber()==MN_NeSel)neSH=true;}}}
//=============================================================================================================
// ( O S 4 ) O P E N  M O R E  S E L  B Y  N E X T B U Y
//=============================================================================================================

// Wenn nach OS4 doch Next-NextBuy offen ist...
  if( neLO==true ){

//  ...berechnen, ob NextBuy unter DON_Sel ist:
    if(OrderSelect(TI_NeBuy,SELECT_BY_TICKET)){
    if(OrderSymbol()==Symbol()){
      DON_Sel=NormalizeDouble( OrderOpenPrice() - D_ONO *Point,Digits);}}


//  Wenn letzter NextBuy unter DON_Sel ist...
    if( Bid < DON_Sel ){// ?

//    Wenn FirstSel über DCAO ist...
      if( Ask > DCAO_FiSel ){// ?


//      ...Lots für NextSel-by-NextBuy berechnen
        L_LO=1.0;
        for(m=OrdersTotal()-1;m>=0;m--){
        if(OrderSelect(m,SELECT_BY_POS)){
        if(OrderSymbol()==Symbol()){
        if( OrderMagicNumber()==MN_FiBuy || OrderMagicNumber()==MN_NeBuy ){


          if( L_LO < 1.0 && OrderLots() < 1.0 )Lots_Sel = L_LO * OrderLots() * Lots_Multi * OdML;
          else Lots_Sel = L_LO * OrderLots() * Lots_Multi ;


          L_LO = Lots_Sel;
         
         
          Print("Lots NextSel:",
         
                "-L_LO=",L_LO,
                "-OdML=",OdML,
                "-Lots_Sel=",Lots_Sel
               
              );
        }}}}


//      ...Prüfen, ob schon NextSel mit letztem Lots_Sel-Ergebnis geöffnet wurde:
        OL=0.0;
        for(n=OrdersTotal()-1;n>=0;n--){
        if(OrderSelect(n,SELECT_BY_POS)){
        if(OrderSymbol()==Symbol()){
        if( OrderMagicNumber()==MN_NeSel ){
       
          if( OrderLots() > OL )OL = OrderLots();
       
        }}}}


//      Wenn noch kein NextSel mit neuestem Lots_Sel-Wert offen ist, NextSel öffnen:
        if( Lots_Sel > OL ){
          if(IsTradeAllowed())TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots_Sel,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,clrBlue);
          if(IsTradeContextBusy())Sleep(slMS);


          Print("Next Sel:"
               
                "-OL=",OL

              );
               
         
          }}} }// Nach OS4 Next-NextBuy offen

//=============================================================================================================
// ( O S 4 )  O P E N  M O R E  B U Y  B Y  N E X T S E L
//=============================================================================================================

//  ...wenn nach OS4 doch NextSel offen ist...
    if( neSH==true ){

//    ...prüfen, ob NeSel über DON_Buy ist:
      if(OrderSelect(TI_NeSel,SELECT_BY_TICKET)){
      if(OrderSymbol()==Symbol()){
        DON_Buy=NormalizeDouble( OrderOpenPrice() + D_ONO *Point,Digits);}}


//    Wenn NextSel über DON_Buy ist...     
      if( Ask > DON_Buy ){// ?

//      ...prüfen, ob FirstBuy DCAO erreicht hat:
        if( Bid < DCAO_FiBuy ){// ?


          L_SH=1.0;
          for(m=OrdersTotal()-1;m>=0;m--){
          if(OrderSelect(m,SELECT_BY_POS)){
          if(OrderSymbol()==Symbol()){
          if( OrderMagicNumber()==MN_FiSel || OrderMagicNumber()==MN_NeSel ){

            if( L_SH < 1.0 && OrderLots() < 1.0 )Lots_Buy = L_SH * OrderLots() * Lots_Multi * OdML;
            else Lots_Buy = L_SH * OrderLots() * Lots_Multi;

            L_SH = Lots_Buy;
           
           
            Print( "Lots NextBuy:",
                 
                  "-L_SH=",L_SH,
                  "-OdML=",OdML,
                  "-Lots_Buy=",Lots_Buy
             
                );
           
          }}}}


//      ...Prüfen, ob schon NextBuy mit letztem Lots_Buy-Ergebnis geöffnet wurde:
        OL=0.0;
        for(n=OrdersTotal()-1;n>=0;n--){
        if(OrderSelect(n,SELECT_BY_POS)){
        if(OrderSymbol()==Symbol()){
        if( OrderMagicNumber()==MN_NeBuy ){
       
          if( OrderLots() > OL )OL = OrderLots();
       
        }}}}


//        Wenn noch kein nextBuy mit letztem Lots_Buy-Wert offen ist, NextBuy öffnen:
          if( Lots_Buy > OL ){
            if(IsTradeAllowed())TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots_Buy,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,clrBlue);
            if(IsTradeContextBusy())Sleep(slMS);


            Print("Next Buy:"
             
                  "-OL=",OL
                 
               
                );
         
         
          }}} }// nach OS3 Next-NextSel offen.

//=============================================================================================================
// N A C H  O S 2  F I R S T - S E L  U N D  F I R S T B U Y  O F F E N
//=============================================================================================================
}// Nach OS2 FirstSel und FirstBuy offen.
//=============================================================================================================
// C L O S E  A L L  B Y  F I R S T  O R D E R S
//=============================================================================================================
//Wenn FirstSel unter DCAO / FirstBuy über DCAO ist, alle Orders schließen.
if( Ask < DCAO_FiSel || Bid > DCAO_FiBuy ){// ?
  for(z=OrdersTotal()-1;z>=0;z--){
  if(OrderSelect(z,SELECT_BY_POS)){
  if(OrderSymbol()==Symbol()){
    if(OrderMagicNumber()==MN_NeSel||OrderMagicNumber()==MN_FiSel){
      if(IsTradeAllowed())OC_Sel=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrRed);
      if(IsTradeContextBusy())Sleep(slMS);}
    if(OrderMagicNumber()==MN_NeBuy||OrderMagicNumber()==MN_FiBuy){
      if(IsTradeAllowed())OC_Buy=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrRed);
      if(IsTradeContextBusy())Sleep(slMS);}}}} }// FirstSel/FirstBuy hat DCAO-Dist erreicht.
//=============================================================================================================
// E A  F U N K T I O N E N  B E E N D E N
//=============================================================================================================
}// void OnTick()


Indikator-Trading 29.11.21 09:44

Zitat:

Zitat von MA-EA (Beitrag 45829)
Da kommt 0,0004 raus. Das wären für den MT4 dann 0.00 Lot. :confused:

Die Lösung ist anscheinend, das Ergebnis noch mal mit 100 zu multiplizieren.

Ich glaube es wäre besser wenn du das Ergebnis mit 100.000 multiplizieren würdest...:rolleyes:


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:51 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum