Mum Açmayı Kontrol Etme - sayfa 3

 
  1. Kod 600'den önce yazılmıştır. Şubat 2014'ten beri değişken adlarında noktalar kullanılamaz. Alt çizgi ile değiştirin.
  2. İşte yönden bağımsız kod örneği
     double DIR, OOP, OCP, ISL;   int OP;
    
    if (     Bid > High[ 1 ]){
       DIR = + 1 ; OOP = Ask; OCP = Bid; OP = OP_BUY;
    }
    else if (Bid <  Low[ 1 ]){
       DIR = - 1 ; OOP = Bid; OCP = Ask; OP = OP_BUY;
    }
    else return ;
    
    ISL = OCP -DIR* pips_to_change( extISL_Pips );
    ... OrderSend (...);
    Açma /kapama fiyatları için Ask/Bid'i değiştirmeniz ve diğer her şeyi bir alışmış gibi yazmanız yeterlidir: ISL, OCP'nin (OCP - ISL) altındadır ve -DIR* bir satış için işareti değiştirir.
    Bir karşılaştırmaya ihtiyacınız varsa (A > B) satış için karşılaştırmayı tersine çevirmek için (A - B) *DIR> 0 kullanın.
 
GumRai :

Fikriniz varmış gibi görünüyor.

Kodunuzu değiştirin ve yayınlayın, ben veya başka biri bunun hakkında yorum yapacak

Hey GumRai,

Burada bir güncelleme yayınladığımdan bu yana bir süre geçti, ancak kod üzerinde çalışıyorum ve sonunda bitirdim - 10 saat çalışırken acı verici. Ancak iki temel sorunum var. 1) Ne yaparsam yapayım, bir hata kodu oluşturuyor: "OrderCloseFunction için bilinmeyen bilet XYZ" ve 2) Dosyayı farklı sihirli sayılar vb. yine de bir seferde yalnızca bir ticaret alır ve çiftleri bağımsız olarak ele almaz. Aslında, daha sonra "Sipariş Kapatma İşlevi için geçersiz bilet" hatası da oluşturur.

Bunu googling denedim ama boşuna. Bana bu konuda doğru yönde rehberlik edebilirseniz gerçekten minnettar olurum. Neyi yanlış yapıyorum?

 #property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict

//part with the extern int stating the terms of the MA removed to reduce space.

int MagicNumber = 1234 ;
int MagicNumber2 = 2345 ;
double Pips;
int BuyTicket;
int SellTicket;
int CloseTicket;
int CloseSellTicket;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   double Ticksize = MarketInfo( Symbol (), MODE_TICKSIZE);
   if (Ticksize == 0.00001 || Ticksize == 0.001 )
   Pips = Ticksize* 10 ;
   else Pips = Ticksize;
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
//---

   static datetime bar_time= 0 ;
   if (bar_time!=Time[ 0 ])
     {
      bar_time=Time[ 0 ];
       double PreviousSlow= iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo, 1 );
       double PreviousSlow2= iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo, 2 );
       double PreviousPriceClose=iClose( NULL , 0 , 1 );
       double PreviousPriceClose2=iClose( NULL , 0 , 2 );
       if ((iOpen( NULL , 0 , 1 )<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if ( OrdersTotal ()== 0 )
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips), "Main Entry EA" ,MagicNumber, 0 , clrLimeGreen );
        }
        
       else
       for ( int i = OrdersTotal ()- 1 ; i >= 0 ; i--) 
         {
         if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
       if (iClose( NULL , 0 , 0 )<PreviousSlow)
        {
          CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage, clrPink );
         }
         }
       if ((iOpen( NULL , 0 , 1 )>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if ( OrdersTotal ()== 0 )
            SellTicket= OrderSend ( Symbol (),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Entry EA" ,MagicNumber2, 0 , clrLimeGreen );
        }
       else
       for (i = OrdersTotal ()- 1 ; i >= 0 ; i--) 
         {
         if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
           if (iClose( NULL , 0 , 1 )>PreviousSlow)
        {
          CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage, clrPink );
              }
     }
     }
     return ( 0 );
     return ( 0 ); 
    }
//--------------

  

Şimdiden çok teşekkürler!

 

İşlemleri girmek için asla OrdersTotal()==0 kullanmayın

Bu, bir ticaretin manuel olarak veya başka bir EA veya başka bir grafik sembolüne eklenmiş aynı EA tarafından açılması durumunda, yalnızca 1 işlemin açılabileceği anlamına gelir.

Global değişken BuyTicket'iniz var, onu -1 olarak başlatın

int BuyTicket =- 1 ;

       if ((iOpen( NULL , 0 , 1 )<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if ( BuyTicket==- 1 )
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),
                                 "Main Entry EA" ,MagicNumber, 0 , clrLimeGreen );
        }

Kapatmadan önce siparişler arasında geçiş yapmayın, gereksiz

else
if ( OrderSelect (BuyTicket,SELECT_BY_TICKET))
  {
   if (OrderCloseTime()== 0 )
     {
       if (Close[ 0 ]<PreviousSlow)
        {
         bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage, clrPink );
         if (CloseTicket)
            BuyTicket=- 1 ;
        }
     }
   else
      BuyTicket=- 1 ;   //Order has closed so reset variable
  }

Şimdi, bilet numaraları için global olarak bildirilen değişkenleri kullanırken, terminalin herhangi bir nedenle kapatılıp yeniden başlatılması durumunda sorunlar olabilir.

Yani yeni bir global kapsam değişkeni bildirin

 bool Recovery= true ;

  
   if (Recovery)
     {
     //loop through open orders and check for magic number, symbol and type
     //if you find a buy order with the magic number and symbol
     BuyTicket=OrderTicket();
     //if you find a sell order with the magic number and symbol
     SellTicket=OrderTicket();
     Recovery= false ;
     }

Bunu hızlı yazdım o yüzden hatalar yapmış olabilirim ama fikir vermesi için bu kadarı yeterli

 
GumRai :


Bunun için bir ton teşekkürler! Döngüyü oraya koymamın nedeni, fark ettiğim şey, satışı kapattığında, bir nedenden dolayı alımı tetiklemeyecek olmasıydı.

Devam ettim ve gerekli değişiklikleri yaptım...ama hala bir şeyler yanlış görünüyor. Şu anda herhangi bir uzun işlem almıyor ve geçersiz biletin hata kodunu ve 4051 OrderClose hatası veriyor. Burada hala neyin yanlış olduğuna dair herhangi bir öneriniz var mı?

Garip olan kısım, hem önceki kodda hem de mevcut kodda (yalnızca satış için), işlemleri makul ölçüde tamamlamış olması (eğer sadece bir grafikte uygulasaydım).

Bunun bu kadar zor olacağını düşünmemiştim haha! Sanırım bunun çok basit ve anlaşılır bir şey olduğunu düşündüğümde yanılmışım...mum MA'nın üzerinde kesişip açıldığında satın al, mum MA'nın üzerine çıkıp aşağı indiğinde kapat ve sat.


 if ((iOpen( NULL , 0 , 1 )<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if (BuyTicket==- 1 )
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips), "Main Entry EA" ,MagicNumber, 0 , clrLimeGreen );
        }
        
       else
       if ( OrderSelect (SELECT_BY_POS,MODE_TRADES))
      {
       if (OrderCloseTime()== 0 )
      {
       if (Close[ 0 ]<PreviousSlow)
        {
           bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage, clrPink );
           if (CloseTicket)
            BuyTicket=- 1 ;
            }
         }
         else
            BuyTicket= - 1 ;
            }
            
       if ((iOpen( NULL , 0 , 1 )>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if (SellTicket==- 1 )
            SellTicket= OrderSend ( Symbol (),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Entry EA" ,MagicNumber2, 0 , clrLimeGreen );
        }
       else
       if ( OrderSelect (SELECT_BY_POS,MODE_TRADES))
       {
         if (Close[ 0 ]>PreviousSlow)
        {
         bool   CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage, clrPink );
               if (CloseSellTicket)
                  SellTicket=- 1 ;
                     }
         }
         else
            SellTicket= - 1 ;
            }
            
     return ( 0 );
     return ( 0 ); 
    }
 

Üzgünüm ama gerçekten ne yapmaya çalıştığını bilmiyorum

 if ( OrderSelect (SELECT_BY_POS,MODE_TRADES))

Herhangi bir sipariş seçmiyor. Kod bile derleniyor mu?

       if (OrderCloseTime()== 0 )
      {
       if (Close[ 0 ]<PreviousSlow)
        {
           bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage, clrPink );
           if (CloseTicket)
            BuyTicket=- 1 ;
            }
         }
         else
            BuyTicket= - 1 ;

Burada else geçerlidir if( OrderCloseTime()== 0) false

       if ( OrderSelect (SELECT_BY_POS,MODE_TRADES))
       {
         if (Close[ 0 ]>PreviousSlow)
        {
         bool   CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage, clrPink );
               if (CloseSellTicket)
                  SellTicket=- 1 ;
                     }
         }
         else
            SellTicket= - 1 ;

Burada, OrderSelect başarısız olursa geçerlidir, ki kesinlikle yapar

 
GumRai :

Üzgünüm ama gerçekten ne yapmaya çalıştığını bilmiyorum

Herhangi bir sipariş seçmiyor. Kod bile derleniyor mu?

Burada else geçerlidir if( OrderCloseTime()== 0) false

Burada, OrderSelect başarısız olursa geçerlidir, ki kesinlikle yapar

Üzgünüm, tamamen benim hatam. Önerilerinizi doğru okumadım/uygulamadım; onları işaret ettiğiniz için çok teşekkürler. Burada çok doğru yaptım. Raporda hiç hata oluşturulmadı. Tek şey şu ki, şimdi zaman zaman birden fazla sat ve al emri giriyor ve bu da işlemleri doğru zamanlarda kapatmasını engelliyor.

Düzenleme: Kesin olmak gerekirse, fiyat MA'nın diğer tarafını geçtiğinde değil, yalnızca SL ve TP'de çıkıyor. Bunun bool ile bir ilgisi var mı?

 int start()
  {
   static datetime bar_time= 0 ;
   if (bar_time!=Time[ 0 ])
     {
      bar_time=Time[ 0 ];
       double PreviousSlow= iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo, 1 );
       double PreviousSlow2= iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo, 2 );
       double PreviousPriceClose=iClose( NULL , 0 , 1 );   //You can just use Close[1]
       if ((iOpen( NULL , 0 , 1 )<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if (BuyTicket==- 1 )
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips), "Main Entry EA" ,MagicNumber, 0 , clrLimeGreen );
        }
       else
       if ( OrderSelect (BuyTicket,MODE_TRADES))
      {
         if (OrderCloseTime()== 0 )
         {
           if (Close[ 0 ]<PreviousSlow)
           {
             bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage, clrPink );
             if (CloseTicket)
               BuyTicket=- 1 ;
               }
            }
             else
               BuyTicket= - 1 ; //Order has closed so reset variable
               }
            
       if ((iOpen( NULL , 0 , 1 )>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if (SellTicket==- 1 )
            SellTicket= OrderSend ( Symbol (),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Entry EA" ,MagicNumber2, 0 , clrLimeGreen );
        }
       else
       if ( OrderSelect (SellTicket,MODE_TRADES))
       {
         if (Close[ 0 ]>PreviousSlow)
        {
         bool CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage, clrPink );
               if (CloseSellTicket)
                  SellTicket=- 1 ;
                     }
         }
         else 
            SellTicket= - 1 ; //Order has closed so reset variable
            }
     return ( 0 );
     return ( 0 ); 
    }
 
if ( OrderSelect (BuyTicket,MODE_TRADES))
Bu bir ticaret seçmiyor, lütfen size verdiğim örneği takip edin ve doğru yapın
 
GumRai :
Bu bir ticaret seçmiyor, lütfen size verdiğim örneği takip edin ve doğru yapın

Kendimi...gerçekten aptal hissediyorum. çok komik. Bunu bulduğun için teşekkürler!!

1) İki şey kaldı...Artık OrderClose 4108 hata kodunu oluşturuyor. Kodu tekrar göndereyim mi? Belirttiğiniz düzeltme ile yukarıdaki ile aynı. Yine de kurallara göre girer ve çıkar.

2) Ve resimde görüldüğü gibi uzun pozisyonu kapatır kapatmaz kısa devreye girmiyor. Yeşil aşağı ok, kısalması gereken yeri gösterir. Bir alım aldı ve sarı MA'nın altında kapandığında bunu zararla kapattı. Burada, kısa gitmiş olmalıydı. Bunu nasıl döngüye sokabilirim?

Çok teşekkürler GumRai. Dürüst olmak gerekirse, yardımın olmadan bu kadar yakına ulaşamazdım.

burada kısa gitmiş olmalı

 
int start()
  {
   static datetime bar_time= 0 ;
   if (bar_time!=Time[ 0 ])
     {
      bar_time=Time[ 0 ];
       double PreviousSlow= iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo, 1 );
       double PreviousSlow2= iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo, 2 );
       double PreviousPriceClose=iClose( NULL , 0 , 1 );   //You can just use Close[1]
       if (BuyTicket==- 1 )
        {
         if ((iOpen( NULL , 0 , 1 )<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
           {
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips), "Main Entry EA" ,MagicNumber, 0 , clrLimeGreen );
           }
        }
       else
       if ( OrderSelect (BuyTicket,SELECT_BY_TICKET))
        {
         if (OrderCloseTime()== 0 )
           {
             if (Close[ 0 ]<PreviousSlow)
              {
               bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage, clrPink );
               if (CloseTicket)
                  BuyTicket=- 1 ;
              }
           }
         else
            BuyTicket=- 1 ; //Order has closed so reset variable
        }

       if (SellTicket==- 1 )
        {
         if ((iOpen( NULL , 0 , 1 )>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
           {
            SellTicket= OrderSend ( Symbol (),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Entry EA" ,MagicNumber2, 0 , clrLimeGreen );
           }
        }
       else
       if ( OrderSelect (SellTicket,SELECT_BY_TICKET))
        {
         if (OrderCloseTime()== 0 )
           {
             if (Close[ 0 ]>PreviousSlow)
              {
               bool CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage, clrPink );
               if (CloseSellTicket)
                  SellTicket=- 1 ;
              }
           }
         else
            SellTicket=- 1 ; //Order has closed so reset variable
        }
     }
   return ( 0 );
  }

Bir sipariş yokken bir siparişi kapatmak için kontrol ederken küçük bir değişiklik.

Koda göre, bir alım kapanırsa, bir satışın hemen açılması için hiçbir sebep yoktur.

Alıştan çıkma koşulu, satış açma koşullarıyla aynı değildir.

Yalnızca mumun açık olup olmadığını kontrol ettiğiniz için, Kapat[0]'ın mum için alınan ilk onayın teklif değeri olacağını unutmayın.

 
GumRai :

Bir sipariş yokken bir siparişi kapatmak için kontrol ederken küçük bir değişiklik.

Kurala göre, bir alım kapanırken bir satışın hemen açılması için hiçbir sebep yoktur.

Alıştan çıkma koşulu, satış açma koşullarıyla aynı değildir.

Yalnızca mumun açık olup olmadığını kontrol ettiğiniz için, Kapat[0]'ın mum için alınan ilk onayın teklif değeri olacağını unutmayın.

Kutsal! Sen yaptın! GumRai'ye tekrar tekrar teşekkürler. En iyisi sensin.

Testi şimdi iletemem, ancak piyasalar açıldıktan sonra, demoda farklı büyüler olduğu sürece bunu diğer çiftlerle kullanabilmem gerektiğini düşünüyorum.