Yarım lotları kapatmak. - sayfa 3

 
DomGilberto :

MathFloor ondalık basamakları AŞAĞI en yakın BÜTÜN sayıya yuvarlar mı?

MathFloor() , belgelerde ne yazıyorsa onu yapar. . . "MathFloor işlevi, x'ten küçük veya ona eşit olan en büyük tamsayıyı temsil eden sayısal bir değer döndürür."

DomGilberto :


FirstTarget, "OrderClose()" içinde özel bir parametre olarak anlamlı mı - "sizeClose"un doğru olduğunu varsayarsak? (alıntılanan koda bakın)

Numara . . . buna sahipsin:

FirstTarget = OrderTakeProfit()-OrderOpenPrice()/ 2 +OrderOpenPrice();

// meaning this

FirstTarget = OrderTakeProfit() - ( OrderOpenPrice() / 2 ) + OrderOpenPrice();

muhtemelen bunu kastettiğinizde. . .

FirstTarget = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 ) ;

Her şeyi açık ve net hale getirmek için parantez (ve boşluk) kullanın.

DomGilberto :


Kodunuz yardımcı olmadı - üzgünüm.

Niye ya ? yanlış mı ? ne şekilde?

DomGilberto :


Özel değişkenleri yazdırabilir misiniz? Eğer öyleyse, dergide görünmediği için yanlış yapıyor olmalıyım.

Evet, herhangi bir değişkeni yazdırabilirsiniz. . . ne yapıyorsun ? kodunu göster.

 
 if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
   {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
      double Lots=OrderLots(); 
      
      double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                half    = MathFloor(Lots/2/lotStep)*lotStep;
                
                if (half < minLot) half = Lots;
         
         half=Lots/2; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
         }
   } 
     
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_SELLSTOP)
    {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES);
      
      double FirstTarget_Sell = OrderOpenPrice() - ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
       
       if (half < minLot) half = Lots;
       half=Lots/2;
       OrderClose(OrderTicket(),half,FirstTarget_Sell,3,DarkViolet); 
       }
    } 


Özel değişkenlerin yazdırılmasıyla ilgili olarak, bunu "FirstTarget_Buy" için nasıl yapabilirim?

Tüm kodumu gözden geçirmek ve çok fazla çıktı almak için zaman harcayacağım - bools ve ints ile nasıl yapılacağını anlıyorum (tamsayı -1 başarısız olur ve bool doğru veya yanlış bir ifadedir - kolay.) ama nasıl olduğunu anlamıyorum özel bir değişkene işlevler atadığınızda bunu yapmak için?

Yukarıdaki "FirsTarget" formülüne ışık tuttuğunuz için teşekkürler! Üzgünüm, formülün nasıl bir araya getirileceğini anlamadığım bir anlamda kodunuzun yardımcı olmadığını söylemek istemiştim... Bunu gerçekten sezgisel buluyorum - "OrderSelect"i çağırmanın basitçe yapmanıza izin vereceğini düşünmüştünüz. o sıradaki parti büyüklüğünün ne olduğunu görün ... ve sonra basitçe bölün ...

Tam bir moron gibi karşılaştığım için özür dilerim!

 
DomGilberto :

Tam bir moron gibi karşılaştığım için özür dilerim!

Hiç de değil, sadece kör noktanızı bulmanız ve aydınlatmanız gerekiyor, sahip olduğunuzda neden bu kadar zor bulduğunuzu merak edeceksiniz, nasıl olduğunu bildiğinizde her şey kolay.

DomGilberto :

Özel değişkenlerin yazdırılmasıyla ilgili olarak, bunu "FirstTarget_Buy" için nasıl yapabilirim?

Tüm kodumu gözden geçirmek ve çok fazla çıktı almak için zaman harcayacağım - bools ve ints ile nasıl yapılacağını anlıyorum (tamsayı -1 başarısız olur ve bool doğru veya yanlış bir ifadedir - kolay.) ama nasıl olduğunu anlamıyorum özel bir değişkene işlevler atadığınızda bunu yapmak için?

Bunun gibi . . . ayrıca kaşlı ayraçlar hakkındaki yorumu da not edin
 if (OpenOrdersThisPair( Symbol ())== 1 && OrderType() == OP_BUYSTOP)
   {
       OrderSelect (OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
       double Lots=OrderLots(); 
      
       double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );

       Print ( "FirstTarget_Buy: " , DoubleToStr(FirstTarget_Buy, Digits ) );   // prints FirstTarget_Buy with the same number of digits as the current symbol
         {                                                                                         // why this brace ?    
         
         double minLot  = MarketInfo( Symbol (), MODE_MINLOT),
                lotStep = MarketInfo( Symbol (), MODE_LOTSTEP),
                half    = MathFloor (Lots/ 2 /lotStep)*lotStep;
                
                 if (half < minLot) half = Lots;
         
         half=Lots/ 2 ; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy, 3 ,DarkViolet);
         }                                                               // why this brace ?   
   } 

DomGilberto :

Formülün nasıl bir araya getirileceğini anlamadığım bir anlamda kodunuzun yardımcı olmadığını söylemek istedim... Bunu gerçekten sezgisel buluyorum - "OrderSelect" çağırmanın ne olduğunu görmenize izin vereceğini düşünürdünüz. parti büyüklüğü bu sıraya göreydi ... ve sonra basitçe bölün ...

Basitçe Siparişi seçin, OrderLots() öğesini kullanın ve ikiye bölün. . . bunu yapabilirsiniz ve birçok durumda işe yarayacaktır. Öngörebildiğim tüm durumlar için kod yazarım, böylece bozulduğunda sürekli düzeltmem gerekmez. . .

Pozisyon büyüklüğünüz 2.0 lot ise; bu ikiye bölünmüş 1.0 lottur ve bu işe yarayacaktır. . .

Pozisyon büyüklüğünüz 0.3 lot ise; bu ikiye bölme 0.15 lottur ve MODE_LOTSTEP 0.1 ise bu geçersiz bir pozisyon boyutu olacaktır. . . 0.1 veya 0.2 NOT 0.15 kullanabilirsiniz, bu yüzden bu kontrolü ve ayarı kodlamanız gerekir.


Burada sahip olduğunuz her durumda çalışmayacaktır. . .

 double Lots = OrderLots(); 
      

         
         half = Lots / 2 ; 
 

Ahhhh! Son 15-20 dakikayı her yerde baskılar yaparak geçirdim - nerede yanlış yaptığımı anlamaya başlıyorum. Ben temelde BEKLEMEDEKİ emri seçiyorum... ANCAK, bekleyen bir emir olduğu için, seçtiğim noktada, OrderLots, stop ve hedeflerin değişmiş olma ihtimali oldukça yüksek, bu yüzden onu koymam gerekecek. bekleyen siparişlerimin tetiklenmeden önce sürekli olarak nasıl hesaplandığıyla senkronize edilmesini sağlamak için bir döngüde.

O lanet olası ikili :P - RaptorUK'ta Spot! Yaptığınız ayar sayesinde şimdi bunun doğru hesaplandığını görebiliyorum :)

Sanırım şimdi çoğunu nasıl yapacağımı biliyorum - Sadece meraktan soruyorum, "eğer" ifadesi SADECE TETİKLENEN siparişi çağırmak için işe yarar. Şu anda, açık bir piyasa emrim olduğunda çağırıyorum, ancak bekleyen emir tetiklendiğinde nasıl çağıracağımı bulmaya çalışıyorum?

Aşağıdaki kod ve ilgili "if" ifadesi, bekleyen açık emirleri çağırıyor gibi görünüyor. Bir siparişin tetiklenmesi temelinde belirli bir özel işleve (örneğin geçersiz) "gitmenin" bir yolunu mu istiyorsunuz? (Mantıklı geliyorsa!)

Benim için çok şey temizlediğiniz için teşekkür ederim :)

 int OpenOrdersThisPair( string pair)
{
   int total= 0 ;
       for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
         {
         OrderSelect (i,SELECT_BY_POS,MODE_TRADES);
         if (OrderSymbol()==pair) total++;
         }
         return (total);
}         

if (OpenOrdersThisPair( Symbol ())> 0 )
 
DomGilberto :

Ahhhh! Son 15-20 dakikayı her yerde baskılar yaparak geçirdim - nerede yanlış yaptığımı anlamaya başlıyorum.

Nasıl olduğunu bildiğin zaman kolay

DomGilberto :


Sanırım şimdi çoğunu nasıl yapacağımı biliyorum - Sadece meraktan soruyorum, "eğer" ifadesi SADECE TETİKLENEN siparişi çağırmak için işe yarar. Şu anda, açık bir piyasa emrim olduğunda çağırıyorum, ancak bekleyen emir tetiklendiğinde nasıl çağıracağımı bulmaya çalışıyorum?

Bekleyen bir Sipariş tetiklendiğinde OP_BUY veya OP_SELL olur, bu nedenle . . .

 if (OrderType() == OP_BUY || OrderType() == OP_SELL)
   { 
   
   }

Bir ipucu, daha fazla boşluk kullanın. . . sıfıra bölme hatası aldığınızda ve bunun nerede olduğunu bulmak istediğinizde, boşluk / boşluk aramak ve tüm yorumlarınız yerine bölmelerinizi bulmak kolaydır. . . bu yüzden = + - / % vb. etrafında boşluk kullanıyorum.

 
Ah tabii ki (yüz avuç içi!)

İyi ipucu - yapacağım! Yardımınız için teşekkür ederim :) Yapabilirsem tekrar göndereceğim!
 
Tamam ben geri döndüm! ... O kadar da iyi bir haber değil - Şanssız bir şekilde birden fazla kod varyasyonunu denedim ve test ettim. Şu anda bulunduğum yer burası.

Baskılarla ilgili hiçbir bilgi alamıyorum? Dergide kesinlikle hiçbir şey çıkmıyor. Bunun, OrderType'ın ilk "if" ifadesinden doğruya gittiği sürece hiçbir şey seçilmediği için olduğunu varsayıyorum? Burada kodda görebildiğim kadarıyla, en azından çok uzakta olmadığımı düşünürdüm...?
 if (OrderType() == OP_BUY ){
   
       for ( int c= OrdersTotal ()- 1 ; c >= 0 ; c-- )
      {
         if ( OrderSelect (c,SELECT_BY_TICKET,MODE_TRADES)== true ){
             Print ( "Order Ticker Number = " ,OrderTicket());
             Print ( "Order Lots Open = " , OrderLots());
            } 
         else if ( OrderSelect (c,SELECT_BY_TICKET,MODE_TRADES)== false ){
             Print ( "Order Select returned the error of " , GetLastError ());
            }
             if (OrderMagicNumber()==MagicNumber)
               if (OrderSymbol()== Symbol ())
                 if (OrderType()==OP_BUY)
                   if (OpenOrdersThisPair( Symbol ())== 1 ) 
                     //if( Bid == FirstTarget_Buy)            
         
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
             Print ( "FirstTarget_Buy: " , DoubleToStr( FirstTarget_Buy, Digits ));
            }
         
         double minLot  = MarketInfo( Symbol (), MODE_MINLOT);{
                 Print ( "The minimum lots are: " , DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo( Symbol (), MODE_LOTSTEP);{
                 Print ( "The Lotstep is: " , DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil (OrderLots()/ 2 /lotStep)*lotStep;{
                 Print ( "The Lots to close is: " , DoubleToStr( half, Digits ));
                }

                 bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy, 3 , CLR_NONE );
             if (Close_Half_Order!=TRUE) Print ( "Close_Half_Order Last Error = " , GetLastError ());
      } 
   }
 
DomGilberto :
Tamam ben geri döndüm! ... O kadar da iyi bir haber değil - Şanssız bir şekilde birden fazla kod varyasyonunu denedim ve test ettim. Şu anda bulunduğum yer burası.

Baskılarla ilgili hiçbir bilgi alamıyorum? Dergide kesinlikle hiçbir şey çıkmıyor. Bunun, OrderType'ın ilk "if" ifadesinden doğruya gittiği sürece hiçbir şey seçilmediği için olduğunu varsayıyorum? Burada kodda görebildiğim kadarıyla, en azından çok uzakta olmadığımı düşünürdüm...?

Bunu yapmadan önce Siparişi nasıl seçiyorsunuz?

 if (OrderType() == OP_BUY ){

Burada hala sorunlarınız var

       for ( int c= OrdersTotal ()- 1 ; c >= 0 ; c-- )
      {
         if ( OrderSelect (c,SELECT_BY_TICKET,MODE_TRADES)== true ){
             Print ( "Order Ticker Number = " ,OrderTicket());
             Print ( "Order Lots Open = " , OrderLots());
            } 
         else if ( OrderSelect (c,SELECT_BY_TICKET,MODE_TRADES)== false ){
             Print ( "Order Select returned the error of " , GetLastError ());  //  OrderSelect has failed,  why do you continue . . . 
            }
             if (OrderMagicNumber()==MagicNumber)                            //  . . . to this line ?
               if (OrderSymbol()== Symbol ())
                 if (OrderType()==OP_BUY)
                   if (OpenOrdersThisPair( Symbol ())== 1 ) 
                     //if( Bid == FirstTarget_Buy) 
 

Neden . . .

 for ( int c = OrdersTotal ()- 1 ; c >= 0 ; c-- )
   {
   if ( OrderSelect (c, SELECT_BY_TICKET, MODE_TRADES) )
      {
       Print ( "Order Ticker Number = " ,OrderTicket());
       Print ( "Order Lots Open = " , OrderLots());
      } 
   else 
      {
       Print ( "Order Select returned the error of " , GetLastError ()); 
       continue ;                                                         // try next order position in the loop
      }
   if (OrderMagicNumber() == MagicNumber)    
       if (OrderSymbol() == Symbol ())
         if (OrderType() == OP_BUY)
             if (OpenOrdersThisPair( Symbol ()) == 1 ) 
 
Bu çaylak hataları yaptığıma inanamıyorum... Canımı sıkıyor! Evet, şimdi yazdırdım ve siparişi seçtim. Bu, baskı açısından çalışan koddur - lotlar hala kapatılmıyor mu? Günlük mesajlarını da aşağıya yapıştırdım.
   if ( OrderSelect ( OrdersTotal (),SELECT_BY_TICKET,MODE_TRADES)== true && OpenOrdersThisPair( Symbol ())== 1 ){
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
           Print ( "FirstTarget_Buy: " , DoubleToStr( FirstTarget_Buy, Digits ));
         }
         
         double minLot  = MarketInfo( Symbol (), MODE_MINLOT);{
                 Print ( "The minimum lots are: " , DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo( Symbol (), MODE_LOTSTEP);{
                 Print ( "The Lotstep is: " , DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil (OrderLots()/ 2 /lotStep)*lotStep;{
                 Print ( "The Lots to close is: " , DoubleToStr( half, Digits ));
                }
       for ( int c= OrdersTotal ()- 1 ; c >= 0 ; c-- )
      {
         if ( OrderSelect (c,SELECT_BY_TICKET,MODE_TRADES)== true ){
             Print ( "Order Ticker Number = " ,OrderTicket());
             Print ( "Order Lots Open = " , OrderLots());
            } 
         else {
           Print ( "Order Select returned the error of " , GetLastError ()); // Order Select does not seem to want to work?
             continue ;
            }
             if (OrderMagicNumber()==MagicNumber)
               if (OrderSymbol()== Symbol ())
                 if (OrderType()==OP_BUY)
                   if (OpenOrdersThisPair( Symbol ())== 1 ) 

                 bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy, 3 , CLR_NONE );
             if (Close_Half_Order!=TRUE) Print ( "Close_Half_Order Last Error = " , GetLastError ());
      } 
   }
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: Order Select returned the error of 0    // Not sure what is going on here?		
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000           // This is the right calculation based 
                                                                                                                      // upon the total lots opened on a pending order - to half.
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931                // This price is also correct.