Mum Açmayı Kontrol Etme - sayfa 4

 
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.

Hey GumRai,

Kodumla bana biraz daha yardım edip edemeyeceğinizi merak ediyordum. Bana hangi kodlara bakmam gerektiğini söylerseniz, önce kendim kodlamaya çalışacağım ve sonra herhangi bir soruyla geri döneceğim.

İstediğim şey, bir ticaret yapıldığında, diyelim ki 50 pip'e (şimdi yaptığı gibi) bir Zararı Durdurma koyması. Bununla birlikte, fiyat işlem yönünde 60 pip hareket ettiğinde, SL'yi başa baş noktasına taşır ve daha sonra işlemden 70 pip uzakta bir son durak olur.

Bunu nasıl yapacaktım? Her zaman olduğu gibi, herhangi bir yardım çok takdir edilecektir.

 

Başabaş için, SL'yi her zaman en az başabaş + 1 puana taşırım. Bu, sonraki kontrollerde çiftlerin karşılaştırılmasıyla ilgili olası sorunları önler

Bu sadece 2 koşulu kontrol etme durumudur (satın almak için)

OrderOpenPrice()>OrderStopLoss()

ve

OrderClosePrice()-OrderOpenPrice>=BreakEvenPoints*Point

daha sonra, SL'nin açık fiyat +1 puan veya kilitlemeye karar verdiğiniz herhangi bir miktar olacak şekilde emri değiştirin.

Bir satış için bu tam tersi koşullardır, ancak başlangıçta SL'nin 0 olup olmadığını da hesaba katmalısınız.

OrderOpenPrice()>OrderStopLoss() || OrderStopLoss()== 0 
 
GumRai :

Başabaş için, SL'yi her zaman en az başabaş + 1 puana taşırım. Bu, sonraki kontrollerde çiftlerin karşılaştırılmasıyla ilgili olası sorunları önler

Bu sadece 2 koşulu kontrol etme durumudur (satın almak için)

ve

daha sonra, SL'nin açık fiyat +1 puan veya kilitlemeye karar verdiğiniz herhangi bir miktar olacak şekilde emri değiştirin.

Bir satış için tam tersi koşullar vardır, ancak başlangıçta SL'nin 0 olup olmadığını da hesaba katmalısınız.

Çok teşekkürler. Aslında, yapacağım şey, ticaret için aracılık maliyetini (kabaca) karşılayacak kadar yeterli puan eklemek.

İkinci satır için neden Orderclose fiyat-OrderOpenPrice kullanayım? Ben o kodu pek anlamadım. Fiyatın ne kadar hareket ettiğini takip edeceğinden Bid-OrderOpenPrice kullanmam gerekmez mi?

Aşağıda yaptığım şeye yakın mıyım?:

 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), 0 , "Main Entry EA" ,MagicNumber, 0 , clrLimeGreen );
           }
           if (OrderOpenPrice()>OrderStopLoss())
               if (Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))
                  OrderModify(BuyTicket, NULL ,Bid-( 50 * Point ), NULL , NULL , clrNONE );
        }

Yukarıda komisyonu harici olarak ilan ettim. Bunun yerine Bid kullandım.

Düzenlemek:

Bu yüzden (aşağıda bulduklarıma dayanarak) yukarıda yazdığım kodun yanlış olduğunu tahmin ediyorum? MQL4 kitabında/yardımında aşağıdakini buldum...Bu sadece bir son durak gibi görünüyor, oysa ihtiyacım olan ilk önce bir Başabaş durağı, ardından sondaki durak. Bunu nasıl değiştirirdim?

 int TrailingStop = 50 ;
               //--- modifies Stop Loss price for buy order 
             if (TrailingStop> 0 )
               {
               OrderSelect (BuyTicket,SELECT_BY_TICKET);
                 if (Bid-OrderOpenPrice()> Point *TrailingStop)
                {
                 if (OrderStopLoss()<Bid- Point *TrailingStop)
                  {
                   bool res =OrderModify(BuyTicket,OrderOpenPrice(), NormalizeDouble (Bid- Point *TrailingStop, Digits ),OrderTakeProfit(), 0 , clrNONE );
                   if (!res)
                         Print ( "Error in OrderModify. Error code=" , GetLastError ());
                     else
                         Print ( "Order modified successfully." );
                    }
                 }
                 }
 
 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), 0 , "Main Entry EA" ,MagicNumber, 0 , clrLimeGreen );
           }
           if (OrderOpenPrice()>OrderStopLoss())
               if (Bid-OrderOpenPrice>=( BuyTicket +(Commission*LotSize)))
                  OrderModify(BuyTicket, NULL ,Bid-( 50 * Point ), NULL , NULL , clrNONE );
        }

Tüm kod bloğunuz BuyTicket==-1 koşuluna bağlıdır

Bir emir açılırsa, BuyTicket = -1 olmaz, bu nedenle işlem açıkken BE'ye geçmek için herhangi bir kontrol yapılmaz.

 if (Bid-OrderOpenPrice>=( BuyTicket +(Commission*LotSize)))

Bilet numarasının fiyatla ne ilgisi var?

OrderOpenPrice()'ı kullanmadan önce bir sipariş seçmelisiniz

OrderClosePrice(), bir alış için emir seçildiğinde, bir satış isteyerek (sipariş hala açıkken) Tekliftir.

 
SharkWaters :

Bu yüzden (aşağıda bulduklarıma dayanarak) yukarıda yazdığım kodun yanlış olduğunu tahmin ediyorum? MQL4 kitabında/yardımında aşağıdakini buldum...Bu sadece bir son durak gibi görünüyor, oysa ihtiyacım olan ilk önce bir Başabaş durağı, ardından sondaki durak. Bunu nasıl değiştirirdim?

   int BreakEvenPoints= 50 ;
   double BE_Decimal=BreakEvenPoints* Point ;
//--- modifies Stop Loss price for buy order 
   if (BreakEvenPoints> 0 )
  {
   OrderSelect (BuyTicket,SELECT_BY_TICKET);
   if (Bid-OrderOpenPrice()>BE_Decimal)
     {
       if (OrderStopLoss()<OrderOpenPrice())
        {
         bool res=OrderModify(BuyTicket,OrderOpenPrice(), NormalizeDouble (OrderOpenPrice()+ Point , Digits ),
                              OrderTakeProfit(), 0 , clrNONE );
         if (!res)
             Print ( "Error in OrderModify to BE. Error code=" , GetLastError ());
         else
             Print ( "Order modified to BE successfully." );
        }
     }
  }
Bunu dene
 
GumRai :
Bunu dene

Puanlar için teşekkürler! Gerekli değişiklikleri yaptım. Derlediğimde, "'Sipariş Seçimi'nin dönüş değerinin kontrol edilmesi gerektiğine dair bir uyarı gösteriyor. Bu, garip bir şekilde, yalnızca bir satın alma işleminin tetiklenmesine ve geri kalanı için tekrar 4108 hata koduna dönüşüyor. Satış işlemi tamam (Ben yapmadım). t bunda herhangi bir değişiklik yapmadı).

Yanlış bir şey yapıyor olmam ihtimaline karşı satın alma kodunun tüm bölümü burada - ama bu bölüm olmamalı, çünkü eklediğim tek şey ortadaki bu kod. Gerisi, daha önce olduğu gibi, mükemmel bir şekilde çalıştı. Burada neyi yanlış yapıyorum?

 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]
       double PreviousPriceClose2=iClose( NULL , 0 , 2 );
       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), 0 , "Main Entry EA" ,MagicNumber, 0 , clrLimeGreen );
               }
           }
   //Stop Order Modify for buy starts here
         int BreakEvenPoints= 50 ;
         double BE_Decimal=BreakEvenPoints* Point ;
         
         if (BreakEvenPoints> 0 )
              {
               OrderSelect (BuyTicket,SELECT_BY_TICKET);
               if (Bid-OrderOpenPrice()>BE_Decimal)
                 {
                   if (OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(), NormalizeDouble (OrderOpenPrice()+ Point , Digits ),OrderTakeProfit(), 0 , clrNONE );
                     if (!res)
                         Print ( "Error in OrderModify to BE. Error code=" , GetLastError ());
                     else
                         Print ( "Order modified to BE successfully." );
                    }
                 }
              }
       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
        }
        

Güncelleme:

Biraz daha Googled ve aşağıdakiyle değiştirdi:

 int BreakEvenPoints= 50 ;
         double BE_Decimal=BreakEvenPoints* Point ;
         
         if (BreakEvenPoints> 0 )
              {
               if ( OrderSelect (BuyTicket,SELECT_BY_TICKET))
               {
               if (Bid-OrderOpenPrice()>BE_Decimal)
                 {
                   if (OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(), NormalizeDouble (OrderOpenPrice()+ 10 * Point , Digits ),OrderTakeProfit(), 0 , clrNONE );
                     if (!res)
                         Print ( "Error in OrderModify to BE. Error code=" , GetLastError ());
                     else
                         Print ( "Order modified to BE successfully." );
                    }
                   }   
                 }
              }


Bu, derlemeye tıkladığımda oluşan hatayı kaldırır. Ancak yine de Journal'da OrderModify 4108 hatası oluşturuyor.

 

Tüm kodunuz if koşulunda bulunur

  if (bar_time!=Time[ 0 ])  

bu nedenle her yeni çubuk için yalnızca bir kez yürütülür.

 

BuyTicket == -1 olduğunda, bilet numarası -1 olan siparişi seçmeye çalışıyorsunuz ve elbette mevcut değil.

Bir sipariş seçmeye çalışmadan önce BuyTicket>0 olup olmadığını kontrol edin

 
GumRai :

Tüm kodunuz if koşulunda bulunur

bu nedenle her yeni çubuk için yalnızca bir kez yürütülür.


Bunu belirttiğin için teşekkürler.

Bunun için, Start like'dan hemen sonra üstte fazladan bir parantez oluşturdum:

 int start() 
{
{

ve sonra bir parantez kapattı (bu, if (bar_time!=Time[ 0 ]) bölümünün tamamını sonlandırdı ve ardından kodu sonuna bir dönüş (0) ve ardından da start()'ı kapatmak için bitiş parantezini yerleştirdi.

Ne kodda ne de arka test Journal'da hata yok ama sadece bir alış ticareti aldı ve bu kadar - fiyatın açıktan daha fazla yükselmemesine rağmen tam açılışta kapandı - bırakın 50 pip hareket etmeyi bırakın .

Bunun, bahsettiğiniz BuyTicket == -1 olmasıyla ilgili olabileceğini düşünün. Ama açıkçası bunu nasıl değiştireceğime dair hiçbir fikrim yok. İlk kod için tavsiyenize dayanarak bu -1 şeyini koyardım - ki bu fevkalade işe yaradı. Ama bir sipariş seçmeye çalışmadan önce BuyTicket>0'ı nasıl kontrol edebilirim?

 
SharkWaters :

Ama bir sipariş seçmeye çalışmadan önce BuyTicket>0'ı nasıl kontrol edebilirim?

Kusura bakmayın ama bunu sormanız gerekiyorsa, bilgi seviyenize göre çok karmaşık kod yazmaya çalışıyorsunuz.

Kodunuzu sizin için birer birer yazamam.