Toplam açık sipariş miktarıyla ilgili sorun

 

Herkese selam. Bu forumda bulabildiğim her türlü tavsiyeyi denedim ama hiçbiri işe yaramıyor. Birisi lütfen yardım eder mi? Sorunun OrderTotal işlevimden kaynaklandığına inanıyorum. 10 döviz çifti ticareti yapıyorum, yani EA'm 10 grafikte açık. Bu basit bir riskten korunma stratejisidir. EA'nın sinyallere bağlı olarak bir ticaret (uzun veya kısa) açmasını istiyorum. Ticaret benim yoluma giderse, Trailingstop veya Kar al. Ancak, işlem bana karşı çıkarsa, ters yönde bir işlem açmasını istiyorum. Kullandığım kod çalışıyor gibi görünüyor ama bazen takılıyor, yani artık herhangi bir işlem açmıyor. Ayrıca, bir çiftte bir veya iki işlem açık olduğunda, diğer çiftlerde herhangi bir işlem açmak istemiyor gibi görünüyor.

İşte kodum

 int start()
{
     {
     if ( OrdersTotal () == 0 )
     if (Close[ 1 ]>Close[ 2 ])
         result= OrderSend ( Symbol (), OP_BUY, 0.01 , Ask, 3 , Ask - StopLoss* 0.0001 , 0 , "Original" , magicNumber, 0 , Blue);
         Print ( "Error setting Original order: " , GetLastError ());
         }

   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) 
  {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)== true )
       if (OrderSymbol()== Symbol ())
       //Calculate the point value in case there are extra digits in the quotes
       if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001 ) PointValue = 0.0001 ;
       else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001 ) PointValue = 0.01 ;
       else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001 ) PointValue = 0.01 ;
       else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);

//calculate new lotsize of hedge based on lotsize of current open trade*Multiplier
       double lots = NormalizeDouble (OrderLots() * Multiplier, 2 ); 
      
     if (OrderType() == OP_BUY) 
      {
         if (Bid - OrderOpenPrice() > NormalizeDouble (TrailingStart *PointValue, Digits ))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble (TrailingStop *PointValue, Digits ))
            {
               if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble (TrailingStop *PointValue, Digits ),
              OrderTakeProfit(), Blue)) 
               Print ( "Error setting Buy trailing stop: " , GetLastError ()); 
              }
            }
             else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge*PointValue, Digits ))
             if ( OrdersTotal () == 1 )
            result= OrderSend ( Symbol (), OP_SELL, lots, Bid, 3 ,  Bid + Stoploss*PointValue, 0 , "Hedge" , 0 , 0 , Blue);
             Print ( "Error setting Sell Hedge: " , GetLastError ());
          }
 
  1. İşlemleri filtrelemeniz gerekir.
           if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)== true )
           if (OrderSymbol()== Symbol ())
          if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001 ) PointValue = 0.0001 ;  // These
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001 ) PointValue = 0.01 ;// four
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001 ) PointValue = 0.01 ; // lines
          else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);                    // Execute only on Symbol orders .
    
          double lots = NormalizeDouble (OrderLots() * Multiplier, 2 );    // This and below are always executed
           if (OrderType() == OP_BUY)                                   // Symbol is irrelevant.             
    
    Parantez ile.
           if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)== true )
           if (OrderSymbol()== Symbol ())
    {                                                                   // Rest of code executes only on Symbol orders.
          if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001 ) PointValue = 0.0001 ;
           else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001 ) PointValue = 0.01 ;
           else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001 ) PointValue = 0.01 ;
           else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
    
           double lots = NormalizeDouble (OrderLots() * Multiplier, 2 ); 
          
           if (OrderType() == OP_BUY) 
             :
    } 

  2. 4 basamaklı bir komisyoncuda nokta = 0.0001
          if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001 ) PointValue = 0.0001 ;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001 ) PointValue = 0.01 ;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001 ) PointValue = 0.01 ;
          else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
    
    Sabit ve basitleştirilmiş.
    PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
    if (MarketInfo(OrderSymbol(), MODE_DIGITS) % 2 = 1 ) PointValue *= 10 ;

  3. Parantez içindeki her şey Symbol() olduğundan, her MarketInfo önceden tanımlanmış değişkenlerle değiştirilebilir
  4. Kod numaralarını sabit tutmayın.
    Dönüş kodlarınızı kontrol edin Fonksiyon dönüş değerleri nelerdir? Onları nasıl kullanırım? - MQL4 forumu ve MQL4 Programlarında Sık Karşılaşılan Hatalar ve Bunların Önlenmesi - MQL4 Makaleleri
    result= OrderSend ( Symbol (), OP_BUY, 0.01 , Ask, 3 , Ask - StopLoss* 0.0001 , 0 , "Original" , magicNumber, 0 , Blue);
 

1. Yardımınız için çok teşekkür ederim. Önerildiği gibi bir parantez ekledim, ancak EA hala sadece bir döviz çiftinde bir ticaret açıyor. Satın alma koşulu karşılanmış olsa bile, diğer grafiklerde herhangi bir işlem açmayacaktır. Haftalardır buna takıldım, lütfen bir daha bakar mısın?

2. EDIT: Artık gerekli değil

3. Kodum şimdi şöyle görünüyor

 int start()
{
  {
     if ( OrdersTotal () == 0 )
     if (Close[ 1 ]>Close[ 2 ])
         result= OrderSend ( Symbol (), OP_BUY, 0.01 , Ask, 3 , Ask - StopLoss* Point * 10 , 0 , "Original" , magicNumber, 0 , Blue);
         Print ( "Error setting Original order: " , GetLastError ());
  }       

   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) 
    {
       //calculate new lotsize of hedge based on lotsize of current open trade*Multiplier
       double lots = NormalizeDouble (OrderLots() * Multiplier, 2 );
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)== true )
       if (OrderSymbol()== Symbol ())
    { 
     if (OrderType() == OP_BUY) 
       {
         if (Bid - OrderOpenPrice() > NormalizeDouble (TrailingStart * Point * 10 , Digits ))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ))
           {
               if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ),
              OrderTakeProfit(), Blue)) 
               Print ( "Error setting Buy trailing stop: " , GetLastError ()); 
           }
         }
             else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge* Point * 10 , Digits ))
             if ( OrdersTotal () == 1 )
            result= OrderSend ( Symbol (), OP_SELL, lots, Bid, 3 ,  Bid + Stoploss* Point * 10 , 0 , "Hedge" , 0 , 0 , Blue);
             Print ( "Error setting Sell Hedge: " , GetLastError ());
       }
 
     if ( OrdersTotal () == 0 )
     if (Close[ 1 ]>Close[ 2 ])
         result= OrderSend ( Symbol (), OP_BUY, 0.01 , Ask, 3 , Ask - StopLoss*PointValue, 0 , "Original" , magicNumber, 0 , Blue);
         Print ( "Error setting Original order: " , GetLastError ());
Herhangi bir çiftte bir emir açıksa, tekrar OrdersTotal()==0 olana kadar başka bir emir açmayacaktır.
 
GumRai :
Herhangi bir çiftte bir emir açıksa, tekrar OrdersTotal()==0 olana kadar başka bir emir açmayacaktır.

Yardımın için teşekkürler. İlk orijinal siparişi yalnızca bir işlemle sınırlamam gerekiyor. Satın alma koşulu karşılandığında EA'nın siparişleri açmaya devam etmesini istemiyorum. Bu yüzden bunu sınırlamak için Orderstotal'ı ekledim. Ancak bu kod, buradaki koda müdahale ediyor gibi görünüyor

 else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge* Point * 10 , Digits ))
             if ( OrdersTotal () == 1 ) //<----------
            result= OrderSend ( Symbol (), OP_SELL, lots, Bid, 3 ,  Bid + Stoploss* Point * 10 , 0 , "Hedge" , 0 , 0 , Blue);
             Print ( "Error setting Sell Hedge: " , GetLastError ());

Burada EA'nın açık ticaret başına yalnızca bir hedge açmasını istiyorum, dolayısıyla OrderTotal ==1

Öyleyse, alım satım sayısını sınırlamanın en iyi yolu nedir, yani bir orijinal alım satım ve bir hedge alım satımı? Teşekkür ederim

 
Trader3000 : Öyleyse, işlem sayısını sınırlamanın en iyi yolu nedir, yani bir orijinal işlem ve bir hedge işlemi?
  1. Bu nedenle, mevcut grafikte açık olan siparişlerin sayısını sayın. OrdersTotal , tüm grafiklerde açık olan emirlerin sayısını verir.
  2. Sihirli sayıya göre filtreleme yapmamak, EA'yı diğerleriyle (diğer TF'lerde kendisi de dahil olmak üzere) uyumsuz hale getirir ve manuel ticaret Sembolü, başka bir ayrı grafiğe başka bir para birimi eklendiğinde Ordersymbol'a eşit değildir. - MQL4 forumu
 

Herkesin yardımları için çok teşekkür ederim. Sorunu çözdüm ve EA şimdi satın alma koşulu karşılandığında tüm grafiklerde bir ticaret açacak, ancak bunun altındaki hiçbir şey çalışmıyor. EA, Trailingstop veya Hedge işlevlerini çağırmıyor. Birisi lütfen bir göz atıp neyi yanlış yaptığımı bana bildirin çünkü çözemiyorum.   

 int start()
{ 
   double Lots = NormalizeDouble (AccountEquity()*Percentage*Lotsize/ 100 , 2 );
   double lots = NormalizeDouble (OrderLots() * Multiplier, 2 );
   total= 0 ;
   for (i = OrdersTotal ()- 1 ; i >= 0 ; i--)
   if ( OrderSelect (i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol ())
    {             
      total++;
    }
    {
     if (total== 0 )
     if (Close[ 1 ]>Close[ 2 ])
    {
         result= OrderSend ( Symbol (), OP_BUY, Lots, Ask, 3 , Ask - StopLoss* Point * 10 , 0 , "Original" , magicNumber, 0 , Blue);
         Print ( "Error setting Original order: " , GetLastError ());     
    }
    
     if (OrderType() == OP_BUY) 
       {
         if (Bid - OrderOpenPrice() > NormalizeDouble (TrailingStart * Point * 10 , Digits ))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ))
           {
               if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ),
              OrderTakeProfit(), Blue)) 
               Print ( "Error setting Buy trailing stop: " , GetLastError ()); 
           }
         }
 else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge* Point * 10 , Digits ))
             if (total == 1 )
            result= OrderSend ( Symbol (), OP_SELL, lots, Bid, 3 ,  Bid + Stoploss* Point * 10 , 0 , "Hedge" , magicNumber, 0 , Blue);
             Print ( "Error setting Sell Hedge: " , GetLastError ());
       }
 
   double Lots = NormalizeDouble (AccountEquity()*Percentage*Lotsize/ 100 , 2 );
   double lots = NormalizeDouble ( OrderLots() * Multiplier, 2 );

Ne yaptığınızı tam olarak bilmiyorum, ancak tek fark büyük harf olmak üzere 2 değişkeni adlandırmaktan kaçınmanızı öneririm. Özellikle kodunuzu okuyan diğer kişiler büyük harfle başlayan değişkenlerin Globalscope olduğu kuralını benimsemişse, 2'yi karıştırmak kolaydır.

Hiçbir sipariş seçilmedi, bu nedenle OrderLots() herhangi bir şey olabilir


    
     if (OrderType() == OP_BUY) 

Bu, önceki döngüde seçilen son sıradaki değerleri kullanır, doğru sihirli sayı veya sembol olmayabilir.

 

Cevabın için teşekkürler. Yapmaya çalıştığım şey, lot büyüklüğünün öz sermayemin bir yüzdesi olduğu ilk orijinal ticareti EA'nın açmasını sağlamak. Ticaret ters giderse

Bana göre, EA ters yönde bir hedge açmalıdır, ancak burada lot boyutu, orijinal lot boyutunun (OrderLots) 3 katı olmalıdır. Yokmuş gibi görünse de

sipariş seçildi, işlemi etkilemedi. Şimdi Lotları doğrudan OrderSend işlevine yerleştirdim, ancak ne sondaki durdurma ne de

hedge, gerektiğinde tetiklenir. Her ikisi de bunu eklemeden önce mükemmel çalıştı

total= 0 ;
   for (i = OrdersTotal ()- 1 ; i >= 0 ; i--)
   if ( OrderSelect (i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol ())
    {             
      total++;
    }

 int start()
{ 
   double Lots = NormalizeDouble (AccountEquity()*Percentage*Lotsize/ 100 , 2 );
   
   total= 0 ;
   for (i = OrdersTotal ()- 1 ; i >= 0 ; i--)
   if ( OrderSelect (i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol ())
    {             
      total++;
    }
    {
     if (total== 0 )
     if (Close[ 1 ]>Close[ 2 ])
         result= OrderSend ( Symbol (), OP_BUY, Lots, Ask, 3 , Ask - StopLoss* Point * 10 , 0 , "Original" , magicNumber, 0 , Blue);
         Print ( "Error setting Original order: " , GetLastError ());     
    }
    {
     if (OrderType() == OP_BUY) 
       {
         if (Bid - OrderOpenPrice() > NormalizeDouble (TrailingStart * Point * 10 , Digits ))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ))
           {
               if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ),
              OrderTakeProfit(), Blue)) 
               Print ( "Error setting Buy trailing stop: " , GetLastError ()); 
           }
         }
             else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge* Point * 10 , Digits ))
             if (total == 1 )
            result= OrderSend ( Symbol (), OP_SELL, NormalizeDouble (OrderLots() * Multiplier, 2 ), Bid, 3 ,  Bid + Stoploss* Point * 10 , 0 , "Hedge" , magicNumber, 0 , Blue);
             Print ( "Error setting Sell Hedge: " , GetLastError ());
       }

{} diş tellerimin doğru yerlerde olmadığına inanıyorum

 
Bir önceki yazımın ikinci bölümünde zaten söylemiştim
 

Şimdiye kadarki tüm yardımlar için çok teşekkür ederim. ilerleme kaydediyorum. Şimdi buna sahibim, böylece EA'nın bir hedge ticareti açma koşulunu görmezden gelmesi dışında her şey olması gerektiği gibi çalışıyor gibi görünüyor. Koşullar karşılanmadığında bile bazen (ancak her zaman değil) bir riskten korunma işlemi açar. Ayrıca TrailingStop her zaman devreye girmiyor. Sanırım hala bir yerde {} parantezlerini kaçırıyorum. Kodum şimdi şöyle görünüyor. Lütfen biri bana bakabilir mi? Teşekkür ederim.

 int start()
{ 
   total= 0 ;
   for (i = OrdersTotal ()- 1 ; i >= 0 ; i--)
   if ( OrderSelect (i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol ())
    {             
      total++;
    }
    {
     if (total== 0 )
     if (Close[ 1 ]>Close[ 2 ])
    {
         result= OrderSend ( Symbol (), OP_BUY, 0.01 , Ask, 3 , Ask - StopLoss* Point * 10 , 0 , "Original" , magicNumber, 0 , Blue);
         Print ( "Error setting Original order: " , GetLastError ());     
    }
     if (OrderType() == OP_BUY) 
       {
         if (Bid - OrderOpenPrice() > NormalizeDouble (TrailingStart * Point * 10 , Digits ))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ))
           {
               if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ),
              OrderTakeProfit(), Blue)) 
               Print ( "Error setting Buy trailing stop: " , GetLastError ()); 
           }
         }
             else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge* Point * 10 , Digits )) //<------- THIS IS BEING IGNORED SOMETIMES (I THINK)
             if (total == 1 )
            {
            result= OrderSend ( Symbol (), OP_SELL, NormalizeDouble (OrderLots() * Multiplier, 2 ), Bid, 3 ,  Bid + Stoploss* Point * 10 , 0 , "Hedge" , magicNumber, 0 , Blue);
             Print ( "Error setting Sell Hedge: " , GetLastError ());
            }
       }
       // else if (OrderType() == OP_SELL)
       // ... 

GumRai :

This would use the values from the last order selected in the previous loop, it may not be the correct magic number or symbol.


Diş tellerini değiştirerek bunu düzeltmeye çalıştım. En iyi yol bu mu, yoksa OrderSend'den önce her zaman OrderSelect işlevini çoğaltmam ve eklemem gerekir mi? Teşekkür ederim
Neden: