Einzelnen Beitrag anzeigen
  #9 (permalink)  
Alt 28.11.21
MA-EA MA-EA ist offline
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 1.178
MA-EA befindet sich auf einem aufstrebenden Ast
Standard

Hallo.

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

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()
Angehängte Dateien
Dateityp: mq4 LoShAL_Ti_v1_PRINT.mq4 (41,3 KB, 2x aufgerufen)