Zıt sırayı aç - sayfa 2

 

4/5 haneli Brokerlar için Kaymayı ayarlamak için bunu yapamazsınız, bu hiçbir anlam ifade etmez.

Kayma bir int, yani bir tam sayı OLMALIDIR, 4 basamaklı bir Broker kayması için Pip cinsindendir, bu nedenle Kayma = 3, 3 Pip anlamına gelir, 5 Haneli Broker kayması için, Kayma = 3, 3 puan veya 0,3 Pip anlamına gelir. Bu nedenle, telafi etmek için, 5 basamaklı bir Broker için kayma rakamı, 30 vererek on ile çarpılmalıdır. . . 30 puan = 3 Pip.

Yani bu kod yanlış. . .

 int init()
   {
   if ( Digits == 3 || Digits == 5 ) pt = 10 * Point ;
   else pt = Point ;
   Slippage = Slippage * pt;    
   }
 

OpenOppositeOrder() işlevinizin bu değiştirilmiş sürümünü deneyin. . .

 void OpenOppositeOrder() 
   {
   int Op;  
 
   for ( int Counter = OrdersTotal ()- 1 ; Counter >= 0 ; Counter--)
      {
       if ( OrderSelect (Counter,SELECT_BY_POS,MODE_TRADES))   // only continue if the OrderSelect() worked
         {
         if (OrderSymbol() == Symbol ()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

             if (Op == OP_BUY && Bid < OrderOpenPrice())
               {      
               Ticket = OrderSend ( Symbol (), OP_SELL, LotSize, Bid, Slippage, 0 , 0 , "Sell Order" , MagicNumber, 0 , Red);
               if (Ticket > 0 ) 
                  {
                   Print ( "Opposite Sell order placed # " , Ticket);
                  AddLimitsSell();
                  }
               else
                  {
                   Print ( "Order Send failed, error # " , GetLastError () );
                  }
               }
               
             if (Op == OP_SELL && Ask > OrderOpenPrice())
               {      
               Ticket = OrderSend ( Symbol (), OP_BUY, LotSize, Ask, Slippage, 0 , 0 , "Buy Order" , MagicNumber, 0 , Green);
               if (Ticket > 0 )
                  {
                   Print ( "Opposite Buy order placed # " , Ticket);
                  AddLimitsBuy();
                  }
               else
                  {  
                   Print ( "Order Send failed, error # " , GetLastError () );
                  }   
               }
            }
         }
      }
   }
 
RaptorUK :

OpenOppositeOrder() işlevinizin bu değiştirilmiş sürümünü deneyin. . .


Merhaba RaptorUk,

Her şeyden önce, şimdiye kadar sağlanan yardım için teşekkür ederiz. Şimdi EA çalışmaya başlar. Bir siparişin kârı varsa tümünün nasıl kapatılacağı konusunda başka değişiklikler yaptım ve bu sorun değil, ancak bu strateji çalışması için zaten gördüğünüz ve tahmin ettiğiniz gibi, kâra ulaşan siparişin önceki siparişleri telafi etmek için lot boyutunun artırılması gereklidir. Bunu göz önünde bulundurarak bunu yapmak için kod tanıttım. Yani burada bir karışıklık ile uğraşıyorum. Son siparişin kârlı olup olmadığını doğrulamam gerekiyor ve OrderProfit()'i bir sonraki sipariş lot büyüklüğünü ayarlayacak şekilde kullanmak istiyorum ama bu bilgiyi almak için önceki siparişi kapatmam gerekmiyor mu?

Burada, açık olan eski siparişin kârlı olup olmadığını bulmak için ekstra kodu tanıttığım, iyi çalışan bir karşı sipariş açma kodu (sizin sayesinde). Bunu almak için doğru yolda mıyım?

Teşekkür ederim

Luis

 void OpenOppositeOrder() 
 {
// LastOrder Loss Compensation 
   int Orders;
   Orders= OrdersTotal ();
   if (Orders> 0 )
   {  
     for (i= 0 ;i<Orders;i++)
   {
     OrderSelect (i,SELECT_BY_POS,MODE_TRADES);
     if (OrderSymbol()== Symbol ()&& OrderMagicNumber()== MagicNumber)
   {
    lastprofit = OrderProfit();
    lastlot = OrderLots();
   }
  }
 }
  mlots= 0 ;
   if (lastprofit< 0 )mlots= NormalizeDouble (lastlot*Multiplier, Digits );
   else mlots=LotSize;
 
//+------------------------------------------------------------------+ 
//Open Opposite Order 
   int Op;  
 
   for ( int Counter = OrdersTotal ()- 1 ; Counter >= 0 ; Counter--)
      {
       if ( OrderSelect (Counter,SELECT_BY_POS,MODE_TRADES))  
         {
         if (OrderSymbol() == Symbol ()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

             if (Op == OP_BUY && Bid < OrderOpenPrice())
               {  
               if (Martingale)ilots=mlots; else ilots=LotSize; 
               Ticket = OrderSend ( Symbol (), OP_SELL, ilots, Bid, UseSlippage, 0 , 0 , "Sell Order" , MagicNumber, 0 , Red);
               if (Ticket > 0 ) 
                  {
                   Print ( "Opposite Sell order placed # " , Ticket);
                  AddLimitsSell();
                  }
               else
                  {
                   Print ( "Order Send failed, error # " , GetLastError () );
                  }
               }
               
             if (Op == OP_SELL && Ask > OrderOpenPrice())
               { 
               if (Martingale)ilots=mlots; else ilots=LotSize;
               Ticket = OrderSend ( Symbol (), OP_BUY, ilots, Ask, UseSlippage, 0 , 0 , "Buy Order" , MagicNumber, 0 , Green);
               if (Ticket > 0 )
                  {
                   Print ( "Opposite Buy order placed # " , Ticket);
                  AddLimitsBuy();
                  }
               else
                  {  
                   Print ( "Order Send failed, error # " , GetLastError () );
                  }   
               }
            }
         }
      }
   }
 
luisneves :


Merhaba RaptorUk,

Her şeyden önce, şimdiye kadar sağlanan yardım için teşekkür ederiz. Şimdi EA çalışmaya başlar. Bir siparişin kârı varsa tümünün nasıl kapatılacağı konusunda başka değişiklikler yaptım ve bu sorun değil, ancak bu strateji çalışması için zaten gördüğünüz ve tahmin ettiğiniz gibi, kâra ulaşan siparişin önceki siparişleri telafi etmek için lot boyutunun artırılması gereklidir. Bunu akılda tutarak bunu yapmak için kod tanıttım. Yani burada bir karışıklık ile uğraşıyorum. Son siparişin kârlı olup olmadığını doğrulamam gerekiyor ve OrderProfit()'i bir sonraki sipariş lot büyüklüğünü ayarlayacak şekilde kullanmak istiyorum ama bu bilgiyi almak için önceki siparişi kapatmam gerekmiyor mu?

Burada, açık olan eski siparişin kârlı olup olmadığını bulmak için ekstra kodu tanıttığım, iyi çalışan bir karşı sipariş açma kodu (sizin sayesinde). Bunu almak için doğru yolda mıyım?

Bunun size sorun yaratacağından şüpheleniyorum. . .

mlots = NormalizeDouble (lastlot * Multiplier, Digits );

örneğin, sonuç 1.12316734 lot ise, 5 basamaklı bir par üzerindeki NormalizeDouble()'niz bunu 1.12316 olarak değiştirir ve bu, Lot Adımı gereksinimine uymaz. . . . değiştirilmiş lot büyüklüğünü Lot Step MarketInfo(Symbol(), MODE_LOTSTEP ) katı yapmak için biraz matematik kullanmanız gerekir

 
RaptorUK :

Bunun size sorun yaratacağından şüpheleniyorum. . .

örneğin, sonuç 1.12316734 lot ise, 5 basamaklı bir par üzerindeki NormalizeDouble()'niz bunu 1.12316 olarak değiştirir ve bu, Lot Adımı gereksinimine uymaz. . . . değiştirilmiş lot büyüklüğünü Lot Step MarketInfo(Symbol(), MODE_LOTSTEP ) katı yapmak için biraz matematik kullanmanız gerekir


Merhaba RaptorUK,

Parti büyüklüğümü bir çok Lot Adımı'nı korumak için tavsiyenizle ilgili olarak, konuyla ilgili kendimi belgelemek istiyorum.

şimdi başka bir sorunum var (bir tane daha ...)

Mevcut fiyatın üstünde ve altında emirleri açmak için, Ea çalışmaya başladığında fiyatı hareketsiz olan satırla karşılaştırdığım bir satır kullanmak istiyorum.

İlk sorun geliyor; fiyat farkı olan hattı nasıl karşılaştırabilirim?

İşte şimdiye kadar sahip olduğum kod. Burada karşılaştırmak için nasıl isim verebilirim çünkü fiyat çizgisinden sonra iHigh'ı koyarsam işe yaramaz.

Bu konulardaki herhangi bir ipucu için şimdiden teşekkür ederiz.

Luis

priceline=iHigh( Symbol (), 0 , 0 );
 ObjectCreate ( "highline" , OBJ_HLINE , 0 , 0 ,Bid); 
 ObjectSet( "highline" , OBJPROP_COLOR ,LimeGreen);
 ObjectSet( "highline" , OBJPROP_WIDTH , 1 );
 WindowRedraw();

Bu hiç işe yaramıyor gibi görünüyor (...)

 if (Bid > priceline+Distance*pt)                      
                {       
// Open buy order

                             while (IsTradeContextBusy()) Sleep ( 10 );
                                 RefreshRates();        
                       
             Ticket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,UseSlippage, 0 , 0 , "Buy Order" ,MagicNumber, 0 ,Green);
             if (Ticket> 0 )AddLimitsBuy();
            }

Buraya nesne silmeyi koydum, çünkü tüm siparişlerin kapanmasıyla satırın silinmesine ihtiyacım var. doğrumuyum ?

 void CloseAll()
      {
         int i,Op,Error;
         int Total= OrdersTotal ();
     
         if (Total> 0 )
         {
         for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
         if ( OrderSelect (pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()== Symbol ())
         {
         Op=OrderType();
         if (Op==OP_BUY)
         {
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if (Op==OP_SELL)
         {
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         else
         {
         ObjectDelete ( "highline" );
         }
        }
       }
      }
 
luisneves :

Bu hiç işe yaramıyor gibi görünüyor (...)

Buraya nesne silmeyi koydum, çünkü tüm siparişlerin kapanmasıyla satırın silinmesine ihtiyacım var. doğrumuyum ?

Tamam, sanırım ne yapmak istediğinizi anlıyorum, Bid'in hattınıza göre nerede olduğunu kontrol etmek istiyorsunuz, bunu yapmak için hattın pozisyonunu almanız gerekiyor. . . ObjectGet() 'i nesne adı ve nesne özellik indeksi OBJPROP_TIME1 ile kullanın, bu, satırın yerleştirildiği fiyatı döndürür.

ObjectDelete() çağrınız bana uygun görünüyor. Özellikle ObjectsDeleteAll() kullanımından hoşlanmıyorum, bunun tembel ve tehlikeli olduğunu düşünüyorum. . . ya da en azından diğerleri için rahatsız edici.

 
RaptorUK :

Tamam, sanırım ne yapmak istediğinizi anlıyorum, Bid'in hattınıza göre nerede olduğunu kontrol etmek istiyorsunuz, bunu yapmak için hattın pozisyonunu almanız gerekiyor. . . ObjectGet() 'i nesne adı ve nesne özellik indeksi OBJPROP_TIME1 ile kullanın, bu, satırın yerleştirildiği fiyatı döndürür.

ObjectDelete() çağrınız bana uygun görünüyor.


Merhaba RaptorUK,

Biri kârla kapanırsa tüm emirleri kapatmaya çalışıyorum, ancak bu gerçekleştiğinde bekleyen bir emir hala açıktır, yine de kapatma talimatı CloseAll() işlevine dahil edilmiştir. Bu konu hakkında herhangi bir ipucu var mı?

Sağladığınız herhangi bir yardım için şimdiden teşekkür ederiz

Luis

 int GoToClose()
 {
   int pos;  
 {
   for ( int Profit= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
   if ( OrderSelect (Profit,SELECT_BY_POS)
  && OrderMagicNumber()==MagicNumber && OrderSymbol()== Symbol ()
  && OrderProfit()+OrderSwap()+OrderCommission()> 0 || OrdersTotal ()> MaxOrders)CloseAll();  
 }
}
//+---------------------------------------------------------------------------+  
       void CloseAll()
      {
         int Op,Error;
                    
         for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
         if ( OrderSelect (pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()== Symbol ())
         {
         Op=OrderType();
         if (Op==OP_BUY)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if (Op==OP_SELL)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         if (Op==OP_SELLSTOP||OP_BUYSTOP||OP_SELLLIMIT||OP_BUYLIMIT)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         else Print ( "Error opening BUY Stop Order : " , GetLastError ());         
         }
        }             
 
luisneves :


Merhaba RaptorUK,

Biri kârla kapanırsa tüm emirleri kapatmaya çalışıyorum, ancak bu gerçekleştiğinde bekleyen bir emir hala açıktır, yine de kapatma talimatı CloseAll() işlevine dahil edilmiştir. Bu konu hakkında herhangi bir ipucu var mı?

İfadelerin nasıl çalıştığını anlamanız gerekir. . . bunu yapamazsın. . .

 if (Op == OP_SELLSTOP || OP_BUYSTOP || OP_SELLLIMIT || OP_BUYLIMIT)

buna benzer bir durum ama tam olarak aynı değil: https://www.mql5.com/en/forum/141790


sonucu nedir. . .

WhatValue = ( 5   || 4   ||   3   ||   2 );

|| bir Bole işlecidir, bu nedenle yalnızca bools üzerinde çalışır. . .


bu, bir bool sonuç değeriyle sonuçlanır. . .

( Op == OP_SELLSTOP )

. . . Değerlerinizde bitsel bir operatör kullanmak istiyorsanız, bunu kullanabilirsiniz. . . .

 int WhatValue = ( 5   | 4   |   3   |   2 );

. . . ama yapmaya çalıştığın şey bu değil.

 
RaptorUK :

İfadelerin nasıl çalıştığını anlamanız gerekir. . . bunu yapamazsın. . .

buna benzer bir durum ama tam olarak aynı değil: https://www.mql5.com/en/forum/141790


sonucu nedir. . .

|| bir Bole işlecidir, bu nedenle yalnızca bools üzerinde çalışır. . .


bu, bir bool sonuç değeriyle sonuçlanır. . .

. . . Değerlerinizde bitsel bir operatör kullanmak istiyorsanız, bunu kullanabilirsiniz. . . .

. . . ama yapmaya çalıştığın şey bu değil.


Merhaba RaptorUK,

Anlıyorum, ama şimdi bunu göz önünde bulundurarak kodu değiştirdim ve bekleyen sipariş hala orada ...

 void CloseAll()
      {
         int Op,Error;
                    
         for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
         if ( OrderSelect (pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()== Symbol ())
         {
         Op=OrderType();
         if (Op==OP_BUY)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if (Op==OP_SELL)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         if (Op==OP_SELLSTOP)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         if (Op==OP_BUYSTOP)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         else Print ( "Error opening BUY Stop Order : " , GetLastError ());         
         }
        }        
 
luisneves :


Merhaba RaptorUK,

Anlıyorum, ama şimdi bunu göz önünde bulundurarak kodu değiştirdim ve bekleyen sipariş hala orada ...

MagicNumber'dan farklı bir Sihirli Numaraya sahip olması veya EA'nın üzerinde çalıştığı sembol dışında bir sembol için olması veya bir OP_SELLLIMIT veya OP_BUYLIMIT olması olabilir. . . ayrıca, OrderDelete() ve OrderClose() çağrılarınızdaki dönüş değerlerini kontrol etmeniz gerekir. . .

Neden RefreshRates() öğesini çağırmanız gerekiyor? Onlardan kurtul demek istemiyorum ama neden RefreshRates()'i bulunduğunuz yere çağırdığınızı açıklayabilir misiniz?


İşlev dönüş değerleri nelerdir? Onları nasıl kullanırım?

Neden: