Toplam açık sipariş miktarıyla ilgili sorun - sayfa 4

 

Herkese selam

Üzgünüm ama çok erken konuştum. RefreshRates() eklemek bir fark yaratıyor gibi görünse de, hala aynı sorunu yaşıyorum. Bazen bekleyen emirlerin ikisini de açar, bazen ikisinden sadece birini, bazen de hiçbirini açmaz. Bir siparişi veya her ikisini de açmadığında hala 130 hatası alıyorum, ancak ikisi de gerçekten açıldığında hata yok. Ayrıca, girişlerimin MODE_STOPLEVEL'in altında olduğu çiftlerde hiçbir zaman sipariş açmadığını ve program girişlerimi istendiği gibi ayarlamasına rağmen her zaman 130 hatası aldığımı fark ettim. Değerleri yazdırıyorum ve beklendiği gibi ayarlanmışlar. Bu yüzden OrderSend'imin neden gerçekten çalışmadığını anlamaya çalışıyorum.

Stoplevelin 5 olduğu EURUSD gibi bir paritede, genellikle her iki emri de gönderir, ancak her zaman değil. Ancak EURAUD gibi stoplevelin 10 olduğu bir paritede asla emir göndermez.

 extern int TrailingStart= 20 ;
extern int TrailingStop= 5 ;

extern int Hedge= 10 ;
extern double Multiplier= 3 ;

extern int StopLossOriginal= 11 ;

extern int StopLossHedge= 9 ;

extern double Percentage= 1 ;
extern double Lotsize= 0.01 ;
extern double MyMaxlots= 30 ;

extern datetime StartTime1 = D'2016.03.25 16:50' ;

extern int Pipmove= 5 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
//---
  {
   int TS=TrailingStart-TrailingStop;
   double stoplevel=(MarketInfo( Symbol (),MODE_STOPLEVEL))/ 10 ;
   if (StopLossOriginal<stoplevel || StopLossHedge<stoplevel || TS<stoplevel)
     {
       MessageBox ( "Please note: Your inputs for StopLossOriginal, StopLossHedge and/or" +
                 "\nTrailingStop are below the minimum levels required by your broker," +
                 "\nand have been increased automatically to " + StringConcatenate (stoplevel)+ " Pips" );
     }
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int TS=TrailingStart-TrailingStop;
   Print ( "TS = " ,TS);
   int sloss=StopLossOriginal-Pipmove;
   int stoplevel=(MarketInfo( Symbol (),MODE_STOPLEVEL))/ 10 ;
   Print ( "stoplevel = " ,stoplevel);
     
   double Lots = NormalizeDouble (AccountEquity()*Percentage*Lotsize/ 100 , 2 ),
          point= Point * 10 ,
          Price=Pipmove*point,
          SL=(StopLossOriginal-Pipmove)*point,
          MinLots = MarketInfo( Symbol (),MODE_MINLOT),
          MaxLots = MarketInfo( Symbol (),MODE_MAXLOT),
          HedgeLots= NormalizeDouble (OrderLots()*Multiplier, 2 );
          
   if (sloss<=stoplevel) SL=stoplevel*point;
   Print ( "SL = " ,SL);
   if (StopLossHedge<=stoplevel) StopLossHedge=stoplevel;
   Print ( "StopLossHedge = " ,StopLossHedge);
   if (TS<=stoplevel) TrailingStart=(stoplevel+TrailingStop); 
   Print ( "TrailingStart = " ,TrailingStart);     
          
   datetime time1=StartTime1- 3300 ;      

   if (Lots>MaxLots) Lots=MaxLots;
   if (Lots<MinLots) Lots=MinLots;
   if (HedgeLots>MaxLots) HedgeLots=MaxLots;
   if (Lots>MaxLots || Lots<MinLots || HedgeLots>MaxLots)
     {
       MessageBox ( "Lotsize have been adjusted automatically" );
     }

   int buy_ticket= 0 , sell_ticket= 0 , buystop_ticket= 0 , sellstop_ticket= 0 , total= 0 ;
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
       if ( OrderSelect (i,SELECT_BY_POS) && OrderMagicNumber()==magic && OrderSymbol()== Symbol ())
        {
         total++;
         if (OrderType()==OP_BUYSTOP) buystop_ticket=OrderTicket();
         if (OrderType()==OP_SELLSTOP) sellstop_ticket=OrderTicket();
         if (OrderType()==OP_BUY) buy_ticket=OrderTicket();
         if (OrderType()==OP_SELL) sell_ticket=OrderTicket();
        }

   if (total== 0 && Time[ 0 ]==time1)
     {
      buy_ticket= OrderSend ( Symbol (),OP_BUYSTOP,Lots,Ask+Price, 30 , 0 , 0 , "Pending" ,magic, 0 ,Lime);
      OrderModify(OrderTicket(),OrderOpenPrice(),Ask-SL,OrderTakeProfit(),Yellow);
       Print ( "Buystop = " , GetLastError ());
       Sleep ( 1000 );
      RefreshRates();
       Sleep ( 1000 );
      sell_ticket= OrderSend ( Symbol (),OP_SELLSTOP,Lots,Bid-Price, 30 , 0 , 0 , "Pending" ,magic, 0 ,Red);
      OrderModify(OrderTicket(),OrderOpenPrice(),Bid+SL,OrderTakeProfit(),Yellow);
       Print ( "Sellstop = " , GetLastError ());
     }

Ben de bu şekilde denedim, ama hiçbir fark yaratmadı:

buy_ticket= OrderSend ( Symbol (),OP_BUYSTOP,Lots,Ask+Price, 30 ,Ask-SL, 0 , "Pending" ,magic, 0 ,Lime);
      RefreshRates();
sell_ticket= OrderSend ( Symbol (),OP_SELLSTOP,Lots,Bid-Price, 30 ,Bid+SL, 0 , "Pending" ,magic, 0 ,Red);

Ve bunu yapsam bile, hiçbir fark yaratmaz:

 if (total== 0 ) // && (Time[0]==time1)
 

Herkese yardımları için teşekkürler. Sonunda işe koyabildim. Tutarlı bir şekilde çalışmasını sağlamamın tek yolu, onu şu şekilde değiştirmekti:

 if ( total== 0 )
     {
      buystop_ticket= OrderSend ( Symbol (),OP_BUYSTOP,Lots,Ask+Price, 30 ,Ask-SL, 0 , "Pending" ,magic, 0 ,Lime);
       Print ( "buystop = " , GetLastError ());
      RefreshRates();
     }
   if ( total== 1 )
     {
      sellstop_ticket= OrderSend ( Symbol (),OP_SELLSTOP,Lots,Bid-Price, 30 ,Bid+SL, 0 , "Pending" ,magic, 0 ,Red);
       Print ( "sellstop = " , GetLastError ());
     }

Ayrıca, bekleyen emir etkinleştirilmeden önceki Pipmove seviyesinin de stop seviyesinden daha yüksek olması gerektiğini anladım. Yani şimdi her şey çalışıyor gibi görünüyor.. Teşekkürler

 
Trader3000 :

Herkese yardımları için teşekkürler. Sonunda işe koyabildim. Tutarlı bir şekilde çalışmasını sağlamamın tek yolu, onu şu şekilde değiştirmekti:

Ayrıca, bekleyen emir etkinleştirilmeden önceki Pipmove seviyesinin de stop seviyesinden daha yüksek olması gerektiğini anladım. Yani şimdi her şey çalışıyor gibi görünüyor.. Teşekkürler

Hayır, bu da işe yaramıyor çünkü artık bir ticaret açık olduğu sürece bir sell_stop açmaya devam edecek
 
Basit cevap, mevcut fiyata bu kadar yakın bekleyen emirler açmaya çalışmamaktır. 5 Puan genellikle yarım piptir
 
GumRai :
Basit cevap, mevcut fiyata bu kadar yakın bekleyen emirler açmaya çalışmamaktır. 5 Puan genellikle yarım piptir

Cevap için teşekkürler. Hesaplamam aslında pip cinsindendir, bu nedenle bekleyen emirler en az 50 puandır ( mevcut fiyattan 5 pip uzakta), ancak onu durma seviyesinden en az 1 pip uzağa taşırsam işe yarıyor gibi görünüyor, ki bu 50 olan EURUSD'deki puanlar. Grafiğe sürükledikten sonra ilki hariç her iki ticareti de açıyormuş gibi görünüyor. Ama şimdilik bu konuda iyiyim. Kodum şimdi şöyle görünüyor:

 extern int TrailingStart= 20 ;
extern int TrailingStop= 5 ;
extern int Hedge= 10 ;
extern double Multiplier= 3 ;
extern int StopLossOriginal= 11 ;
extern int StopLossHedge= 9 ;
extern double Percentage= 1 ;
extern double Lotsize= 0.01 ;
extern double MyMaxlots= 30 ;
extern datetime StartTime1 = D'2016.03.25 14:50' ;
extern int Pipmove= 5 ;
int i,TS=TrailingStart-TrailingStop,stoplevel=(MarketInfo( Symbol (),MODE_STOPLEVEL))/ 10 ; //stoplevel has been converted from points to pips (/10)

int start()
  {
   double Lots = NormalizeDouble (AccountEquity()*Percentage*Lotsize/ 100 , 2 ),
          point= Point * 10 ,
          Price=Pipmove*point,
          SL=StopLossOriginal*point,
          MinLots = MarketInfo( Symbol (),MODE_MINLOT),
          MaxLots = MarketInfo( Symbol (),MODE_MAXLOT),
          HedgeLots= NormalizeDouble (OrderLots()*Multiplier, 2 );

   if (StopLossHedge<stoplevel) StopLossHedge=stoplevel;
   if (TS<stoplevel) TrailingStart=(stoplevel+TrailingStop);
   if (Pipmove<stoplevel+ 1 ) Pipmove=stoplevel+ 1 ;
   if (StopLossOriginal<=StopLossHedge) StopLossOriginal=StopLossHedge+ 1 ;

   datetime time1=StartTime1- 300 ;

   int buy_ticket= 0 ,sell_ticket= 0 ,buystop_ticket= 0 ,sellstop_ticket= 0 ,total= 0 ;
   for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)
       if ( OrderSelect (i,SELECT_BY_POS) && OrderMagicNumber()==magic && OrderSymbol()== Symbol ())
        {
         total++;
         if (OrderType()==OP_BUYSTOP) buystop_ticket=OrderTicket();
         if (OrderType()==OP_SELLSTOP) sellstop_ticket=OrderTicket();
         if (OrderType()==OP_BUY) buy_ticket=OrderTicket();
         if (OrderType()==OP_SELL) sell_ticket=OrderTicket();
        }

   if (total< 1 && Time[ 0 ]==time1)
     {
      buystop_ticket= OrderSend ( Symbol (),OP_BUYSTOP,Lots,Ask+Price, 30 ,Ask-SL, 0 , "Pending" ,magic, 0 ,Lime);
      RefreshRates();
      sellstop_ticket= OrderSend ( Symbol (),OP_SELLSTOP,Lots,Bid-Price, 30 ,Bid+SL, 0 , "Pending" ,magic, 0 ,Red);
     }

Ayrı ama benzer bir sorunla karşılaştım. Bekleyen siparişlerden biri tetiklendiğinde, iki şeyden biri olabilir. Diğer bekleyen siparişin silindiği noktada TrailingStop'u tetikler. ya da bu ticaret bana karşı çıkarsa, ters yönde bir hedge açmalı. Kodu nasıl yazdığıma bağlı olarak, birden fazla hedge açacak veya hiç hedge açmayacak. Aşağıdaki ikisi de dahil olmak üzere her şeyi denedim:

 if ( OrderSelect (buy_ticket,SELECT_BY_TICKET) && OrderType()==OP_BUY)
     {
       if (Bid-OrderOpenPrice()>TrailingStart*point)
        {
         if (OrderStopLoss()<Bid-TrailingStop*point)
           {
             if (OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*point,OrderTakeProfit(),Blue))
              {
               if ( OrderSelect (sellstop_ticket,SELECT_BY_TICKET) && OrderType()==OP_SELLSTOP)
                 {
                   if (OrderDelete(sellstop_ticket,Orange))
                     return ( 0 );
                 }
              }
           }
        }
       if (OrderOpenPrice()>Bid+Hedge*point && buy_ticket== 1 && sell_ticket<= 1 )
            {
              sell_ticket= OrderSend ( Symbol (),OP_SELL,HedgeLots,Bid, 3 ,Bid+StopLossHedge*point, 0 , "Hedge" ,magic, 0 ,Red);
            }  
        }
//Same for Sell

Veya:


 //Same up to here:
else if ( total<= 2 && OrderOpenPrice()>Bid+Hedge*point)
        {
         sell_ticket= OrderSend ( Symbol (),OP_SELL,HedgeLots,Bid, 3 ,Bid+StopLossHedge*point, 0 , "Hedge" ,magic, 0 ,Red);
        }

Bunun için ayrı bir for döngüsü kullanmalı mıyım? Teşekkür ederim

 

Herkese selam

Haftalarca uğraştım ve hala bir ilerleme kaydedemedim. Belirli koşullar altında EA'nın orijinal ticarette birden fazla hedge işlemi açması dışında her şey şu anda çalışıyor. Orijinal ticarette SL 11 pip ve Hedge ticaretinde SL 9 piptir. Bazen hedge ticareti, orijinal ticaret hala açıkken 9 pipte durdurulur. Daha sonra, orijinal ticaret hala açıkken ikinci bir riskten korunma ticareti ve hatta 3. ve 4. bir işlem açacaktır. Ben sadece hedge işlemlerinin miktarını bir ile sınırlamak istiyorum ve eğer durdurulursa, bekleyin ve orijinal ticarette ne olacağını görün.

Bu, aldığım sonuçların türü:

576 2015.01.15 11:39 dur satın al 29 0.48 1.16786 1.16616 0.00000 0,00 4834.24

577 2015.01.15 11:39 sat dur 30 0.48 1.16642 1.16812 0.00000 0,00 4834.24

578 2015.01.15 11:39 satmak 30 0.48 1.16642 1.16812 0.00000 0,00 4834.24

579 2015.01.15 11:39 silmek 29 0.48 1.16786 1.16616 0.00000 0,00 4834.24

580 2015.01.15 11:42 satın almak 31 1.44 1.16743 1.16653 0.00000 0,00 4834.24

581 2015.01.15 11:42 s/l 31 1.44 1.16653 1.16653 0.00000 -129.60 4704.64

582 2015.01.15 11:44 satın almak 32 1.44 1.16742 1.16652 0.00000 0,00 4704.64

583 2015.01.15 11:44 s/l 30 0.48 1.16812 1.16812 0.00000 -81.60 4623.04

584 2015.01.15 11:48 değiştirmek 32 1.44 1.16742 1.16893 0.00000 0,00 4623.04

Buystop ve sellstop emirleri (29 ve 30) olması gerektiği gibi açılır. Daha sonra fiyat düşer ve alış durdurma (29) silinirken satış emri (30) doldurulur. Ardından fiyat tekrar yükselir ve hedge(martingale) emri (31) tetiklenir (3*lot boyutu). Daha sonra fiyat tekrar düşer ve koruma (31) durdurulur, ancak 30 hala açık olduğu için başka bir korumayı (32) tetikler, vb. 32. emrin tetiklenmesini nasıl önleyebilirim? Teşekkür ederim


 

Herkese selam. Bunu çözmeye çalıştığım bir aydan fazla oldu ve programlamanın kodlamanın imkansız olduğunu düşünmeye başladım. Bu yüzden lütfen biri bunu onaylarsa, onu dinlendirip devam edebilirim. Yukarıdaki gönderide açıklandığı gibi hedge(martingale) emirlerinin sayısı için derin bir seviye belirlemek mümkün değil mi? Teşekkür ederim.

Şimdiye kadar sahip olduğum en iyi şey:

 int start()
{
   int buy_ticket= 0 ;
   int sell_ticket= 0 ;
   int total= 0 ;
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
       if ( OrderSelect (i,SELECT_BY_POS) && OrderSymbol()== Symbol ())
     {
         total++;
         if (OrderType()==OP_BUY) buy_ticket=OrderTicket();
         if (OrderType()==OP_SELL) sell_ticket=OrderTicket();
        }
   /*if(total==1 && OrderSelect(buy_ticket,SELECT_BY_TICKET) && OrderType()==OP_BUY) <------- this blocked out code is irrelevant, but I want to put it here for completeness
     {
      if(Bid-OrderOpenPrice()>TrailingStart*point)
        {
         if(OrderStopLoss()<Bid-TrailingStop*point)
           {
            if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop *point,OrderTakeProfit(),Blue))
               return(0);
           }
        }*/
       else if (OrderOpenPrice()>Bid+Hedge*point)
        {
         sell_ticket= OrderSend ( Symbol (),OP_SELL,HedgeLots,Bid, 3 ,Bid+StopLossHedge*point, 0 , "Hedge" ,magic, 0 ,Blue);
         return ( 0 );
        }
     }
  }
 

Bunu başarmanın farklı yolları vardır.

Hedge açıldığında, müşteri terminalinin Global Değişkenini oluşturun.

Ana ticaretin bilet numarasını içeren bir isim verin.

Ona, söz konusu bilet numarası için bir riskten korunma işleminin açıldığını gösteren bir bayrak görevi gören bir değer veya gerekirse bir riskten korunma sayımı verin.

Bir çit açmadan önce GV'yi kontrol edin.


Hedge ve ana ticaret farklı lot büyüklüklerine sahiptir.

Bir hedge açmadan önce, ana işlemin açık zamanından daha sonra bir OrderOpenTime() ile ilgili lot boyutunda karşıt bir emir açılıp açılmadığını görmek için açık emirleri ve geçmişini kontrol edin.

 
GumRai :

Bunu başarmanın farklı yolları vardır.

Hedge açıldığında, müşteri terminalinin Global Değişkenini oluşturun.

Ana ticaretin bilet numarasını içeren bir isim verin.

Ona, o bilet numarası için bir riskten korunma işleminin açıldığını gösteren bir bayrak görevi gören bir değer veya gerekirse bir riskten korunma sayımı verin.

Bir çit açmadan önce GV'yi kontrol edin.


Hedge ve ana ticaret farklı lot büyüklüklerine sahiptir.

Bir hedge açmadan önce, ana işlemin açık zamanından daha sonra bir OrderOpenTime() ile ilgili lot boyutunda karşıt bir emir açılıp açılmadığını görmek için açık emirleri ve geçmişini kontrol edin.

Çok teşekkür ederim bu seçenekleri değerlendirip bilgi vereceğim.
 

Bu yüzden bunu Global Değişken aracılığıyla başarmaya çalıştım, ancak bu kodu eklediğimden beri, hiçbir şekilde bir riskten korunma işlemi açmıyor. Bence sorun, EA'nın GlobalVariableCheck yapıyor olması, ancak henüz hiçbiri oluşturulmadığı için devam etmeyecek. Ancak doğru bilet numarasını seçip yazdırır. Belki de yanlış yapıyorum. İşte ilgili kod:

 //+------------------------------------------------------------------+
//|  Hedge                                                           |
//+------------------------------------------------------------------+
void Hedgetrade(){
int buy_hedge= 0 ,sell_hedge= 0 ,total= 0 ;
double Pip= Point * 10 ,HedgeLots= NormalizeDouble (OrderLots()*Multiplier, 2 ),SLHedge=StopLossHedge*Pip;
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--){
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)&& OrderSymbol()== Symbol ()){
      total++;
       int ticket=OrderTicket();
       Print ( "ticket = " ,ticket);
     }          
         if (OrderType()==OP_BUY){
             if (buy_hedge== 0 && sell_hedge== 0 && OrderOpenPrice()>Bid+Hedge*Pip)
               GlobalVariableCheck (ticket);
               sell_hedge= OrderSend ( Symbol (),OP_SELL,HedgeLots,Bid, 3 ,Bid+SLHedge, 0 , "Hedge" , 0 , 0 ,Blue);
                   GlobalVariableSet (ticket, 1 );
                 }
         if (OrderType()==OP_SELL){
             if (sell_hedge== 0 && buy_hedge== 0 && OrderOpenPrice()<Ask-Hedge*Pip)
               GlobalVariableCheck (ticket);
               buy_hedge= OrderSend ( Symbol (),OP_BUY,HedgeLots,Ask, 3 ,Ask-SLHedge, 0 , "Hedge" , 0 , 0 ,Red);
                   GlobalVariableSet (ticket, 1 );
              }
            }
          }