Yarım lotları kapatmak. - sayfa 8

 
DomGilberto :

Bu, for döngüm sırasında Günlük'te yazdırılıyor, burada, bekleyen bir Satın Alma Durdurma Emri olması durumunda, 60 EMA, OrderStopLoss'tan > ise, bekleyen siparişi kapatacak, yeni SL ile yeni bir tane açacaktır. 60EMA'nın arkasında), 1:2 ödülünü eğlendirmek için kârı al ayarını yapın ve puanlardaki durma noktasına ve risk profilime göre lotları değiştirin (%2 diyelim).

Yani tüm bunlar yapılırken, OrderSend içindeki "LotSize" özel değişkeni olan "Mevcut Lotlar" çalışıyor, sunucunun alması için doğru olmayan bir lot boyutu mu gönderiyor? "0.18215"? Bu, siparişlerin her halükarda gönderilmesine rağmen bir sorun olabilir mi - bu soru daha çok ""OrderType==OP_BUY" arayamamın nedeni bu olabilir mi?

Bunu düzeltmeli, parti boyutunu zaten sahip olduğunuz şekilde doğrulamalısınız. . . zaten sahip olduğunuz koda göre bunu yapmak için ayrı bir işlev bile kodlayabilirsiniz. . . örneğin:

 double ValidateLots( double PositionSize)
   {
   double LotStep, MinLot;

   LotStep = MarketInfo( Symbol (), MODE_LOTSTEP);
   MinLot  = MarketInfo( Symbol (), MODE_MINLOT);
   
   return ( MathFloor (PositionSize / LotStep) * LotStep);
   }


OrderSend() içinde LotSize kullanmak yerine ValidateLots(LotSize) kullanırsınız.

Yine de sorununuza bunun neden olduğundan şüpheliyim. . .

 
Hmm - evet sadece onunla oynadım. Görünüşe göre, sunucu yine de yalnızca 0,00 (2 ondalık basamak) izin verdiği için sipariş gönderiliyor. Yani kalan rakamlar neredeyse alakasız.

Ah! Çok sinir bozucu lol - çok uzun zamandır buna takıldım :(

Bunun neden bir sorun olduğunu anlayamıyorum ve bir "OP_BUY" seçemiyorum... Bu konuyu muhtemelen tükettiğimi biliyorum, ancak karanlıkta kalan son bıçaklamalar gerçekten takdir edilecektir - bana da yardım ettiğiniz için teşekkürler!!
 if (direction== 0 ){ <<< //--Buy--// This gets called upon if all the set-up is apparent.
      
       double bsl=buy_stop_price;
       double btp=buy_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/ 10 ; //--// ( in process of changing at the moment )
      
       if (OpenOrdersThisPair( Symbol ())== 0 )  //--//<--- No order open = then open one...
      {
       int BuyTicketOrder = OrderSend ( Symbol (),OP_BUYSTOP,LotSize,buyPrice, 3 ,bsl,btp, NULL ,MagicNumber, 0 ,Green); //--//<-- This is the first Order to be placed.
      }
      
         if (OrderStopLoss()< iMA ( NULL , 0 ,MA_Period, 0 , 1 , 0 , 0 )-MA_PadAmount*pips) //--//<<-- This will 99% of the time be true and the order above will be cancelled and looped in the "for" until the order is triggered.
         {
         
               for ( int b= OrdersTotal ()- 1 ; b >= 0 ; b--) 
                  {
    
                     if ( OrderSelect (b,SELECT_BY_POS,MODE_TRADES)== true )
                     {
                     Print ( " Stop loss value for the order is " , OrderStopLoss());
                     }
    
                     else if ( OrderSelect (b,SELECT_BY_POS,MODE_TRADES)== false )
                     {
                     Print ( " OrderSelect failed error code is " , GetLastError ());
                     }
                     if (OrderMagicNumber()==MagicNumber)
                         if (OrderSymbol()== Symbol ())
                           if (OrderType()==OP_BUYSTOP)
                               if (OrderStopLoss()< iMA ( NULL , 0 ,MA_Period, 0 , 1 , 0 , 0 )-MA_PadAmount*pips)
                                 //if(OpenOrdersThisPair(Symbol())==1)
                                 { 
                                 DeleteOrder = OrderDelete(OrderTicket());
                                 if (DeleteOrder!=TRUE) Print ( "Buy Delete Order Last Error = " , GetLastError ());
                                 }
                                  
                                 if (OpenOrdersThisPair( Symbol ())== 0 ) //<<-- If there are no open orders = place a new order.
                                  { 
                                   int NewBuyOrder = OrderSend ( Symbol (),OP_BUYSTOP,LotSize,buyPrice, 3 ,bsl,btp, NULL ,MagicNumber, 0 ,Green); 
                                   if (NewBuyOrder == - 1 ) Print ( "New Buy Order Last Error = " , GetLastError ());
                                   if (NewBuyOrder > 0 ) Print ( "NEW BUY ORDER:- Lots to open: " , DoubleToStr(LotSize, Digits ), " Entry Price: " , DoubleToStr(buyPrice, Digits ), 
                                   " Buy Stop Loss: " , DoubleToStr(bsl, Digits ), " Buy Take Profit: " , DoubleToStr(btp, Digits ), " Magic Number is: " , DoubleToStr(MagicNumber, Digits ));  
                                  } 
                  }
             } 
       }
 
DomGilberto :
Hmm - evet sadece onunla oynadım. Görünüşe göre, sunucu yine de yalnızca 0,00 (2 ondalık basamak) izin verdiği için sipariş gönderiliyor. Yani kalan rakamlar neredeyse alakasız.

Ah! Çok sinir bozucu lol - çok uzun zamandır buna takıldım :(

Bunun neden bir sorun olduğunu anlayamıyorum ve bir "OP_BUY" seçemiyorum... Bu konuyu muhtemelen tükettiğimi biliyorum, ancak karanlıkta kalan son bıçaklamalar gerçekten takdir edilecektir - bana da yardım ettiğiniz için teşekkürler!!

Sanırım tüm kodunuzu göstermeniz gerekiyor. . .

Burada bazı sorunlar görüyorum:

       int BuyTicketOrder = OrderSend ( Symbol (),OP_BUYSTOP,LotSize,buyPrice, 3 ,bsl,btp, NULL ,MagicNumber, 0 ,Green); //--//<-- This is the first Order to be placed.
      }
       //  where are you checking the return value from the OrderSend() and reporting errors ?

         if (OrderStopLoss()< iMA ( NULL , 0 ,MA_Period, 0 , 1 , 0 , 0 )-MA_PadAmount*pips)     //  where is the OrderSelect() ?
 
Tüm kodlar buraya sığmayacak mı? Yine de pastebin'e koydum mu?

- http://pastebin.com/eaY1wKbN

Sözdizimi için üzgünüm - her şeyi görmek biraz daha zor, ancak MQL4'e sahip değiller mi? Öyleyse C++ altına koy
 
DomGilberto :
Tüm kodlar buraya sığmayacak mı? Yine de pastebin'e koydum mu?

- http://pastebin.com/eaY1wKbN

Sözdizimi için üzgünüm - her şeyi görmek biraz daha zor, ancak MQL4'e sahip değiller mi? Öyleyse C++ altına koy

Sorun yok . . .

Bunu yaptığınızda. . .

 //+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+

   if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET,MODE_TRADES)== true && OpenOrdersThisPair( Symbol ())== 1 && OrderType()==OP_BUY)
     {

. . . Hangi Sipariş zaten seçili? bekleyen emir miydi? Eğer halihazırda bir Siparişiniz seçili değilse, OrderTicket()'iniz başarısız olursa, OrderSelect()'iniz başarısız olacaktır. Bu koda gerçekten ihtiyacınız var mı? daha sonra, siparişleri seçip sembollerini ve Sihirli Numarayı kontrol edip yazdığınız bir döngü var. . .

Bunun da düzeltilmesi gerekiyor. . .

         if (OrderMagicNumber()==MagicNumber)
             if (OrderSymbol()== Symbol ())

               Print ( "Current Bid: " ,DoubleToStr(Bid, Digits ), " FirstTarget_Buy: " ,DoubleToStr(FirstTarget_Buy, Digits ));

         if (OrderType()==OP_BUY && Bid>=FirstTarget_Buy+( Point / 2 )) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
           {
             Print ( "Bid >= FirstTarget_Buy - Current Bid: " ,DoubleToStr(Bid, Digits ), " FirstTarget_Buy: " ,DoubleToStr(FirstTarget_Buy, Digits ));
             bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid, 3 , CLR_NONE );
             if (Close_Half_Order_Buy!=TRUE) Print ( "Close_Half_Order_Buy Last Error = " , GetLastError ());
           }

. . . reklam bazı parantez. . .

         if (OrderMagicNumber()==MagicNumber)
             if (OrderSymbol()== Symbol ())
               {
               Print ( "Current Bid: " ,DoubleToStr(Bid, Digits ), " FirstTarget_Buy: " ,DoubleToStr(FirstTarget_Buy, Digits ));

               if (OrderType()==OP_BUY && Bid>=FirstTarget_Buy+( Point / 2 )) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
                 {
                 Print ( "Bid >= FirstTarget_Buy - Current Bid: " ,DoubleToStr(Bid, Digits ), " FirstTarget_Buy: " ,DoubleToStr(FirstTarget_Buy, Digits ));
                 bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid, 3 , CLR_NONE );
                 if (Close_Half_Order_Buy!=TRUE) Print ( "Close_Half_Order_Buy Last Error = " , GetLastError ());
                 }
               }
 

Tamam - Ne yapıldığına ve hangi noktaya geldiğine dair biraz netlik elde etmek için daha fazla baskı aldım. aşağıya yapıştırdım.

"Kapanış için Sipariş Seçimi:-..." yazan satır, yukarıda sorduğunuz "OP_BUY Yarım Lot @ 1:1 Fonksiyonu Kapat" noktasında seçili olan satırdır. Bu seçim noktasında bilet numarası farklı mı görünüyor? "...&& OrderType()==OP_BUY" kısmını silmiştim, bu kısım "if" ifadesinde olmadığında geri kalanı yazdırıyor gibi görünüyor... Bu biraz daha netlik sağlıyor mu?

"İlk Satın Alma Siparişi Verildi:-", başlangıçta gerçekleşen ilk Sipariş Gönder işlevidir
"Satın Alma Siparişini Kontrol Etme:-" MA > OrderStopLoss() ise, bekleyen siparişi silmek ve yeniden açmak için for döngüsü içinde olandır.
"YENİ SATIN ALMA SİPARİŞİ:-", bu for döngüsü içine yerleştirilen yeni sipariştir.
"Kapanış için Sipariş Seçimi:-..." - yukarıda belirtildiği gibi, partilerin yarısını kapatmak için seçilen kısım budur.

Bu kafa karıştırıcı olduysa özür dilerim, çünkü bu kısımları yeni ekledim - bunu yukarıdaki pastebin bağlantısında görmeyeceksiniz... sadece basit yazdırma işlevleri :)

 2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: Current Bid: 1.35972 FirstTarget_Buy: 1.37931
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931 // This is the price where half the lots will close.
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: Order Lots Open = 0.18
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: Order Ticker Number = 9
2013.08 . 02 13 : 33 : 57   2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: The Lots to close is : 0.09000
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: The Lotstep is : 0.01000
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: Order Select for closing:- Lots open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is : 1234 Order Ticket Number: 9
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: NEW BUY ORDER:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is : 1234.00000 Order Ticket Number: 8
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: open # 9 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: delete # 8 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: Checking Buy Order:- Lots to open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is : 1234 Order Ticket Number: 8
2013.08 . 02 13 : 33 : 57    2013.02 . 01 15 : 00   trendfishing_play_ground EURUSD,H1: First Buy Order placed:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is : 1234.00000 Order Ticket Number: 7
 
DomGilberto :

Tamam - Ne yapıldığına ve hangi noktaya geldiğine dair biraz netlik elde etmek için daha fazla baskı aldım. aşağıya yapıştırdım.

"Kapanış için Sipariş Seçimi:-..." yazan satır, yukarıda sorduğunuz "OP_BUY Yarım Lot @ 1:1 Fonksiyonu Kapat" noktasında seçili olan satırdır. Bu seçim noktasında bilet numarası farklı mı görünüyor? "...&& OrderType()==OP_BUY" kısmını silmiştim, bu kısım "if" ifadesinde olmadığında geri kalanı yazdırıyor gibi görünüyor... Bu biraz daha netlik sağlıyor mu?

"İlk Satın Alma Siparişi Verildi:-", başlangıçta gerçekleşen ilk SiparişGönder işlevidir
"Satın Alma Siparişini Kontrol Etme:-" MA > OrderStopLoss() ise, bekleyen siparişi silmek ve yeniden açmak için for döngüsü içinde olandır.
"YENİ SATIN ALMA SİPARİŞİ:-", bu for döngüsü içine yerleştirilen yeni sipariştir.
"Kapanış için Sipariş Seçimi:-..." - yukarıda belirtildiği gibi, partilerin yarısını kapatmak için seçilen kısım budur.

Bu kafa karıştırıcı olduysa özür dilerim, çünkü bu kısımları yeni ekledim - bunu yukarıdaki pastebin bağlantısında görmeyeceksiniz... sadece basit yazdırma işlevleri :)


Ekli deneyin. . . ne yapmaya çalıştığınıza dair en iyi tahminim bu. . .
Dosyalar:
dom.mq4  24 kb
 

Ah harika - teşekkür ederim. Doğru yönde atılmış büyük bir adım. Sanırım bir for döngüsü içinde olduğu için fiyatı yarı yarıya yarı yarıya kapatmak istiyor... Sadece bir kez yapmak yerine? Sadece bu da değil, fiyat >= istediğim çıkış fiyatına ulaştığı anda yarı kapanmıyor gibi görünüyor, bunun yerine ötesine geçiyor ve sonra fiyat istediğim çıkış fiyatına geri döndüğünde, o zaman kapanıyor - garip ... Bana yardım etme sabrını takdir et! Zaman ayırdığınız için çok minnettarım!!


GÜNCELLEME: Ayrıca, strateji test cihazını çalıştırmadan önce uzman özelliklerini (extern int) değiştirirsem, yakın yarının hiç çalışmadığını - yakın yarıyı etkileyen şeylerin "MA_PadAmount" olduğunu anladım. pip olarak takip eden stoploss'a pad olarak eklemek istediğim noktalar ve emirlerin giriş fiyatına pad olarak kaç pip koyabileceğimi belirtmemi sağlayan "OrderPrice_PadAmount"...

 
DomGilberto :
Ah harika - teşekkür ederim. Doğru yönde atılmış büyük bir adım. Sanırım bir for döngüsü içinde olduğu için fiyatı yarı yarıya yarı yarıya kapatmak istiyor... Sadece bir kez yapmak yerine? Sadece bu da değil, fiyat >= istediğim çıkış fiyatına ulaştığı anda yarı kapanmıyor gibi görünüyor, bunun yerine ötesine geçiyor ve sonra fiyat istediğim çıkış fiyatına geri döndüğünde, o zaman kapanıyor - garip ... Bana yardım etme sabrını takdir et! Zaman ayırdığınız için çok minnettarım!!
Bu for döngüsü değil, sadece yarısının zaten kapalı olduğunu bilmenin bir yolu yok. . . bununla nasıl başa çıkmayı planladın?
 
Evet - for döngüsünü kaldırdığımda tam anlamıyla bunu anladım. OrderTicket numarasını ilk seçildiği andan itibaren, OrderClose işini yaptıktan ve doğru döndüğünde izlersem, farklı olacağı için bunu OrderTicket numarasıyla doğrulayabileceğimi söylemekte haklı mıyım? ve yeni bir sipariş gelene kadar beklemek mi?

Bunu nasıl yazacağımdan tam olarak emin değilim, ama bu kabaca doğru satırlarda mı?