EA için gereken basit kod (iki açık siparişi değiştirin) - sayfa 3

 

Temelde belirli bir zamanda bekleyen iki emir belirledim, özellikle 23:00 GMT+2 sanırım. Bekleyen emirlerden biri satış stop, diğeri alış stop, her iki emir de açıktan 23:00 mumundan eşit uzaklıkta, bu durumda 14 pip. Her ikisi de 28 piplik bir TakeProfit'e (bu durumda) ve 55 piplik bir StopLoss'a sahiptir.

Şimdi her iki emir de yerine getirildiğinde (esas olarak emirler sona ermeden 23:00 mumunda açık fiyattan 14 pip yukarı ve aşağı gidiyor), her iki emrin de kâr almalarının örneğin 20 pip artmasını istiyorum. . Yani bu durumda yeni kar almaları 58 pip. Durdurma kaybı ancak boyunca aynı tutulmalıdır. Esasen yapmaya çalıştığım şey bir tür riskten korunma işi.

Eğer iki işlem açıksa, fiyatın bir yönde oldukça fazla gitmesi muhtemeldir, eğer her iki işlemin de kârı artarsa, herhangi bir zararı iptal etmek için yeterlidir. Herhangi bir kar elde etmek için, yalnızca bir işlem açılır ve kâr al'a ulaşır veya her iki işlem de tek bir yöne gitmeden açılır ve kâr al'a ulaşır.

Umarım bu açıktır, değilse daha net olması gereken bir resim sunacağım.

 
WHRoeder :

Direkt bir önceki yazınıza atıfta bulundum

madmax3 2012.03.09 14:52
İşte tüm EA için gözden geçirilmiş kod:
Bu hala belirttiğim sorunları gösteriyor.
Kodun bu kısmı EA'nın başka bir kısmı için olduğuna inanıyorum, bekleyen emirleri açan kısım, bunun düzeltmeye çalıştığım kısım üzerinde herhangi bir etkisi olur mu? Üzgünüm, özellikle orijinal gönderide kodun bazı kısımlarını karıştırdığımı düşünüyorum. Bununla birlikte, kodun özellikle ihtiyacım olan kısmına belirttiğinizi yaptım.
 
madmax3 :

Umarım bu açıktır, değilse daha net olması gereken bir resim sunacağım.

Açık, teşekkürler.

Yani bu siparişleri sadece bir kez değiştirmek istiyorsunuz. . . o zaman cevap basit. 23:00 barını kontrol etmeniz ve siparişlerin açılması gereken TP'leri belirlemeniz gerekir. . . emirler aynı TP'deyse değiştirilmeleri gerekir, eğer aynı TP'de değilseler zaten değiştirilmişlerdir ve tekrar değiştirilmeleri gerekmez. . . basit.

 
RaptorUK :

Açık, teşekkürler.

Yani bu siparişleri bir kez değiştirmek istiyorsunuz. . . o zaman cevap basit. 23:00 barını kontrol etmeniz ve siparişlerin açılması gereken TP'leri belirlemeniz gerekir. . . emirler aynı TP'deyse değiştirilmeleri gerekir, eğer aynı TP'de değilseler zaten değiştirilmişlerdir ve tekrar değiştirilmeleri gerekmez. . . basit.

Değiştirme ve kontrol sadece iki işlem açıkken yapılmalıdır, bunu nasıl yapabilirim? Zaten sahip olduğum koda eklemeli miyim yoksa yeniden başlamalı mıyım?

Bu nedenle, esasen, iki işlem varsa (aynı sembol ve sihirli sayı) EA, daha önce mevcut olan bekleyen emirlere (şimdi gerçekleştirilir) kıyasla açık işlemlerin karını alma durumunu kontrol etmelidir ve sonra bunlar aynıysa, değişti ve bir kez döngüye girdikten sonra tekrar kontrol edecek ve aynı olmadıklarını görecek ve bu nedenle işlemleri daha fazla değiştirmeyecek mi?
 
madmax3 :
1. Değişiklik ve kontrol sadece iki işlem açıkken yapılmalıdır, bunu nasıl yapabilirim? Zaten sahip olduğum koda eklemeli miyim yoksa yeniden başlamalı mıyım?

2. Bu nedenle, esasen, iki işlem varsa (aynı sembol ve sihirli sayı) EA, önceden mevcut bekleyen emirlerle (şimdi yürütülmekte olan) karşılaştırıldığında açık işlemlerin karını alma durumunu kontrol etmelidir ve sonra bunlar aynıysa, değiştirilmeli ve bir kez döngüye girdiğinde tekrar kontrol edecek ve aynı olmadıklarını görecek ve bu nedenle işlemleri daha fazla değiştirmeyecek mi?

1. Açık emirler arasında dolaşın, sembolü, sihirli sayıyı kontrol edin, bekleyen emir tipi olmayan bir eşleşmeniz olduğunda bir sayacı artırın. . . Siparişleri kontrol ettiğinizde 2 saydıysanız, doğru sembol ve sihirli sayı için 2 açık siparişiniz olur. . . . yani şimdi onları değiştirebilirsiniz. . . bkz. 2.

2. Hayır, etkinleştirildiyse ve artık beklemede değilse bekleyen siparişlerin TP'sini göremezsiniz. EA, 23:00 çubuğunu kontrol etmeli ve orijinal TP'lerin ne olacağını hesaplamalıdır. . . ardından bunları 2 açık siparişin TP'leri ile karşılaştırın. . . . bu bilgilerden, değiştirme veya değiştirmeme kararı verilebilir.

 
RaptorUK :

1. Açık emirler arasında dolaşın, sembolü, sihirli sayıyı kontrol edin, bekleyen emir tipi olmayan bir eşleşmeniz olduğunda bir sayacı artırın. . . Siparişleri kontrol ettiğinizde 2 saydıysanız, doğru sembol ve sihirli sayı için 2 açık siparişiniz olur. . . . yani şimdi onları değiştirebilirsiniz. . . bkz. 2.

2. Hayır, etkinleştirildiyse ve artık beklemede değilse bekleyen siparişlerin TP'sini göremezsiniz. EA, 23:00 çubuğunu kontrol etmeli ve orijinal TP'lerin ne olacağını hesaplamalıdır. . . ardından bunları 2 açık siparişin TP'leri ile karşılaştırın. . . . bu bilgilerden, değiştirme veya değiştirmeme kararı verilebilir.

Ah anlıyorum, sanırım başından beri yapmaya çalıştığım şey bu. Şimdiye kadar siparişlerden biri değiştirildi (özellikle benim testimde 2. sipariş olan satın alma) ancak değiştirilmeye devam ediyor, tekrar etmesini önlemek için 'break' kullanıyor muyum? Ayrıca, açık emirleri sadece ve sadece ikisi açık olduğunda nasıl sayar ve değiştiririm? Bunun için OrdersTotal() kullanmaya çalışıyorum ama işe yaramıyor, her sipariş için iki ayrı kod parçası yapmam gerektiğini düşünmüyorum değil mi?
Yalnızca çift numaralı açık siparişler değiştiriliyor ve dediğim gibi defalarca değiştiriliyorlar, OrderSelect() için çeşitli kombinasyonlar denedim ama hala çözemiyorum, dediğim gibi MQL'de tam bir çaylakım ve Bu EA neredeyse bitti, bu yüzden sadece bitirmek istiyorum. Bunu okudum https://book.mql4.com/trading/ordermodify bunun benim durumumla bir ilgisi olabilir mi? Zararı durdurmak için ama esasen kar almak için buna ihtiyacım var.

Burada neyi yanlış yapıyorum?

     for ( int iPos = OrdersTotal ()- 1 ; iPos >= 1 ; iPos--) if (
         OrderSelect (iPos, SELECT_BY_POS)                     // Only my orders w/
    &&   OrderMagicNumber ()  == MagicNumber                 // my magic number
    &&   OrderSymbol ()       == "EURUSD"                  // and my pair.
    && ( OrderType () == OP_BUY)
    ){ OrderModify ( OrderTicket (), OrderOpenPrice (), OrderStopLoss (),Ask+((TakeProfit+ 20 )* Point ), 0 , Blue );}
     return ( 0 );
    
   if (
         OrderSelect (iPos- 1 , SELECT_BY_POS- 1 )                    
    &&   OrderMagicNumber ()  == MagicNumber                
    &&   OrderSymbol ()       == "EURUSD"                 
    && ( OrderType () == OP_SELL)
    ){ OrderModify ( OrderTicket (), OrderOpenPrice (), OrderStopLoss (),Ask+((TakeProfit- 20 )* Point ), 0 , Blue );}
return ( 0 );
  }

TP'nin 23:00 mumuyla aynı olup olmadığını nasıl kontrol edebilirim? Açık emirler 2 tanesi oradayken değiştirildiği sürece aynı etkiyi elde edeceğine göre, bu şekilde gerekli olur mu? Yoksa bu sadece siparişin sürekli değiştirilmesini durdurmak için mi ve evet belgeleri kontrol ettim.

Teşekkürler,

madmax3

 

2. sıra değiştirilmeden önce iadeniz (0) sizi start()'tan çıkarıyor.

Yaptığınız tek şey, sıraya göre sıralamayı seçmek, doğru Sihirli numaraya sahip olup olmadığını kontrol etmek, doğru sembol olup olmadığını kontrol etmek ve OP_BUY olup olmadığını kontrol etmektir. . . . o zaman onu değiştirirsiniz, daha önce değiştirilip değiştirilmediğini nereden belirliyorsunuz?

EA, kesintiye uğramaktan kurtulabilmeniz gerekir. .. siparişleriniz verilirse ve MT4 çökerse, yeniden başlatıldığında kaldığı yerden devam edebilmesi gerekir.

Bu nedenle, Siparişin daha önce değiştirilip değiştirilmediğini veya değiştirilmesi gerekip gerekmediğini belirlemeniz gerekir. . . nasıl ?

" Belirli bir zamanda iki bekleyen emir belirledim, özellikle 23:00 GMT+2 sanırım. Bekleyen emirlerden biri satış stop, diğeri alış stop, her iki emir de açıktan eşit uzaklıkta. 23:00 mum, bu durumda 14 pip. Her ikisinin de TakeProfit 28 pip (bu durumda) ve StopLoss 55 pip var. "

23:00 mumunu referans alarak orijinal TP'nin nerede olduğunu hesaplayabilir, sırayı kontrol edebilir ve hala orijinal TP'ye ayarlanıp ayarlanmadığını görebilirsiniz, eğer öyleyse değiştirilebilir. . . değilse, zaten değiştirildi, bu yüzden tekrar değiştirmeyin.

Siparişin değiştirildiğini kaydetmenin başka yolları da vardır, bilet numarasını takip edin, değiştirildiğinde bilgileri bir dosyaya yazın, yeniden değiştirmek üzereyken dosyayı açın ve bilet numarasını kontrol edin, vb. . . . Orijinal TP'ye karşı kontrol etmenin çok daha basit olduğunu düşünüyorum.

 

Şimdiye kadar bu var,

 //+------------------------------------------------------------------+
//|                                                  TimeBasedEA.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
//changed by:       "forex4capital@yahoo.ca"
//changed again by: madmax3

// Time frame: M5 and higher

extern int      MagicNumber = 20080122 ;
extern double DistancefromAsk;
extern double DistancefromBid;
extern double   TakeProfit  = 28 ;
extern double   StopLoss    = 55 ;
extern double   Lots        = 0.1 ;
extern int      StartHour   = 2300 ;       // Open Trade time
extern bool     OpenBuy     = true;
extern bool     OpenSell    = true;
extern int      NumBuys     = 1 ;
extern int      NumSells    = 1 ;
extern int      Slippage    = 2 ;

//+------------------------------------------------------------------+
//|                        S T A R T                                 |
//+------------------------------------------------------------------+
int start()
  {
   int cnt, ticket, total;
       if ( TimeDayOfWeek ( TimeCurrent ())== 5 && TimeCurrent ()>= StrToTime ( "22:59" )) { CloseAll(); return ( 0 ); }
   int ct;
//-------------------------------------+
   if ( Bars < 100 )
     {
       Print ( "bars less than 100" );
       return ( 0 );  
     }
//-------------------------------------+

//-------------------------------------+
   if (TakeProfit< 10 )
     {
       Print ( "TakeProfit less than 10" );
       return ( 0 );   // check TakeProfit
     }
//-------------------------------------+

   ct = Hour () * 100 + Minute ();
   total= OrdersTotal ();
   if (total< 1 ) 
     {
       // no opened orders identified
       if ( AccountFreeMargin ()<( 1000 *Lots))
        {
         Print ( "We have no money. Free Margin = " , AccountFreeMargin ());
         return ( 0 );  
        }
       // check for long position (BUY) possibility
       if (ct == StartHour && Close[ 1 ]>Open[ 1 ] && OpenBuy)
       //if(ct == StartHour && High[1]<Open[0] && OpenBuy)
        {
         for ( cnt = 0 ; cnt < NumBuys; cnt++)
         {
           ticket= OrderSend ( Symbol (),OP_BUYSTOP,Lots,Ask+(DistancefromAsk* Point ),Slippage,Bid-(StopLoss* Point ),Ask+(TakeProfit* Point ), "" ,MagicNumber, TimeCurrent ()+ 39600 , CLR_NONE );
           ticket= OrderSend ( Symbol (),OP_SELLSTOP,Lots,Bid-(DistancefromBid* Point ),Slippage,Ask+(StopLoss* Point ),Bid-(TakeProfit* Point ), "" ,MagicNumber, TimeCurrent ()+ 39600 , CLR_NONE ); 
           if (ticket> 0 )
           {
             if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ( "BUY order opened : " , OrderOpenPrice ());
           }

          
           else Print ( "Error opening BUY order : " , GetLastError ()); 
           

         }
         return ; 
        }
       // check for short position (SELL) possibility
       if (ct == StartHour && Close[ 1 ]<Open[ 1 ] && OpenSell)
       //if(ct == StartHour && Low[1]>Open[0] && OpenSell)
        {
         for ( cnt = 0 ; cnt < NumSells; cnt++)
         {
           ticket= OrderSend ( Symbol (),OP_SELLSTOP,Lots,Bid-(DistancefromAsk* Point ),Slippage,Ask+(StopLoss* Point ),Bid-(TakeProfit* Point ), "" ,MagicNumber, TimeCurrent ()+ 39600 , CLR_NONE );
           ticket= OrderSend ( Symbol (),OP_BUYSTOP,Lots,Ask+(DistancefromBid* Point ),Slippage,Bid-(StopLoss* Point ),Ask+(TakeProfit* Point ), "" ,MagicNumber, TimeCurrent ()+ 39600 , CLR_NONE );
           if (ticket> 0 )
           {
             if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ( "SELL order opened : " , OrderOpenPrice ());
           }
           else Print ( "Error opening SELL order : " , GetLastError ());
         } 
         return ; 
        
    
}
//---------------------------------------------------------------

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name= "check.csv" ;         // File name
   
    Handle= FileOpen (File_Name, FILE_CSV | FILE_WRITE | FILE_READ , ";" ); //File opening
   

         FileWrite (Handle, "Ticket" , "Magic" , "OTime" , "Type" , "Lots" , "Symbol" , "OPrice" , "S/L" , "T/P" ); 
         
           for ( int iPos = OrdersTotal ()- 1 ; iPos >= 1 ; iPos--)
      {       
       OrderSelect (iPos,SELECT_BY_POS) ;
       FileWrite (
         Handle,
         OrderTicket (),                 //int
         OrderMagicNumber (),           //int
         TimeToStr ( OrderOpenTime ()),   //datetime
         
         OrderLots (),                   //double
         OrderSymbol (),                 //string
         OrderOpenPrice (),             //double
         OrderStopLoss (),               //double
         OrderTakeProfit (),             //double
         TimeToStr ( OrderCloseTime ())   //int
       
        ) ; //end file write
           }   }
           
}
//---------------------------------------------------------------   
 
     
     
   void CloseAll()
{
   for ( int cnt= OrdersTotal ()- 1 ;cnt>= 0 ;cnt--)
   {
       OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
       if ( OrderMagicNumber ()!=MagicNumber) continue ;
         
       //
       //
       //
       //
       //
         
       if ( OrderType ()==OP_BUY || OrderType ()==OP_SELL)
      {
         for ( int c= 0 ; c< 3 ; c++)
         {
             RefreshRates ();
             if ( OrderType ()==OP_BUY)
                  { double cp = Bid;}  
             else   {        cp = Ask;}
               
             OrderClose ( OrderTicket (), OrderLots (),cp, 0 , Yellow );
               int err= GetLastError ();
               if (err== 4 || err== 136 || err== 137 || err== 138 || err== 146 )
               {
                   Sleep ( 5000 ); continue ;
               }  
               break ;                     
         }
         break ;
      }
      }
      }
   
// the end.

Yukarıda yer alan dosya yazma kodu,

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

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name= "check.csv" ;         // File name
   
    Handle= FileOpen (File_Name, FILE_CSV | FILE_WRITE | FILE_READ , ";" ); //File opening
   

         FileWrite (Handle, "Ticket" , "Magic" , "OTime" , "Type" , "Lots" , "Symbol" , "OPrice" , "S/L" , "T/P" ); 
         
           for ( int iPos = OrdersTotal ()- 1 ; iPos >= 1 ; iPos--)
      {       
       OrderSelect (iPos,SELECT_BY_POS) ;
       FileWrite (
         Handle,
         OrderTicket (),                 //int
         OrderMagicNumber (),           //int
         TimeToStr ( OrderOpenTime ()),   //datetime
         
         OrderLots (),                   //double
         OrderSymbol (),                 //string
         OrderOpenPrice (),             //double
         OrderStopLoss (),               //double
         OrderTakeProfit (),             //double
         TimeToStr ( OrderCloseTime ())   //int
       
        ) ; //end file write
          	FileClose(Handle); }   }
           
}
//---------------------------------------------------------------   

Bu hataları alıyorum ama

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA Sürüm 2: FileOpen - çok fazla açık dosya

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA Sürüm 2: FileWrite'ta geçersiz tanıtıcı -1

Ne oldu?

 

Neden iki seçenekten en zorunu seçtin?

Dosyaya yazmayı bitirdiğinizde, onu kapatmanız gerekir. . . zaten açıksa tekrar açmanıza gerek yok.

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

int Handle,                         // File descriptor
    Qnt_Symb;                           // Number of recorded symbols
string File_Name= "check.csv" ;         // File name
   
Handle= FileOpen (File_Name, FILE_CSV | FILE_WRITE | FILE_READ , ";" ); //File opening     File opened here, outside the loop
   

FileWrite (Handle, "Ticket" , "Magic" , "OTime" , "Type" , "Lots" , "Symbol" , "OPrice" , "S/L" , "T/P" ); 
         
for ( int iPos = OrdersTotal ()- 1 ; iPos >= 1 ; iPos--)
   {       
   OrderSelect (iPos,SELECT_BY_POS);
   FileWrite (
         Handle,
         OrderTicket (),                 //int
         OrderMagicNumber (),           //int
         TimeToStr ( OrderOpenTime ()),   //datetime   //  this is a string - Time  to  String
         
         OrderLots (),                   //double
         OrderSymbol (),                 //string
         OrderOpenPrice (),             //double
         OrderStopLoss (),               //double
         OrderTakeProfit (),             //double
         TimeToStr ( OrderCloseTime () )   //int     //  this is a string - Time  to  String
       
        ) ; //end file write

   FileClose (Handle);       //  why close the file inside the loop when it was opened outside the loop ?
   }   
}    //  what is this code inside of ?
           
}  // end of start
//--------------------------------------------------------------- 

for döngünüz yanlış. . . son sipariş pozisyonu 0 değil 1

 
RaptorUK :

Neden iki seçenekten en zorunu seçtin?

Dosyayı kullanarak değişiklik ve kontrol yapmanın yolu bu değil mi? Yoksa her iki kodu, değişikliği (sonuncudan önceki mesajım) ve dosya kodunu (sadece daha fazla değişiklik yapılmadığından emin olmak için) birleştirmem mi gerekiyor?
Neden: