Görüş - çok başarılı EA - 3000 dolarlık hesap iki haftada 6300 dolara (9000 dolar olabilirdi) - sayfa 5

 

İşe gitmeden önce 1 hızlı şey, doğru veya yanlış olabilen boole değişkenleri var. Bunun için bir dize kullanmanıza gerek yok.

Kitabı takip ettiğinize inanmak zor

 
zzuegg :

İşe gitmeden önce 1 hızlı şey, doğru veya yanlış olabilen boole değişkenleri var. Bunun için bir dize kullanmanıza gerek yok.

Kitabı takip ettiğinize inanmak zor

Deniyorum. Aynı anda + program + MQL ticareti yapmayı öğreniyorum.

Tek başına kitap okuyarak araba kullanmayı mı öğreniyorsun?

ama teşekkür ederim

 
MickGlancy :

OpenBuyOrder ve OpenSellOrder işlevinin sonuç döndürmediği hatası alıyorum

Neyi yanlış yapıyorum ?

OpenBuyOrder() ve OpenSellOrder() işlevleri aslında bir sonuç döndürmediği için bu hatayı alıyorsunuz .. onları void olarak tanımladınız, yani herhangi bir argüman döndürmediler, ancak bir tamsayı (0) döndürmeye çalışıyorsunuz.

işte bazı yorumlar içeren kod:

 void OpenBuyOrder( double StopLoss, double TakeProfit )
{
         int Ticket;			
         double SL,TP,SLP,TPP,OPP;
         
         if (HideSL==false && StopLoss> 0 ){SL=Ask-StopLoss* Point ;}
         else {SL= 0 ;}
         
         if (SL> 0 && SL>(Bid-MarketInfo( Symbol (),MODE_STOPLEVEL)* Point )){SL=Bid-MarketInfo( Symbol (),MODE_STOPLEVEL)* Point ;}
         
         if (HideTP==false && TakeProfit> 0 ){TP=Ask+TakeProfit* Point ;}
         else {TP= 0 ;}
         
         Ticket= OrderSend ( Symbol (),OP_BUY,Lots,Ask,Slippage,SL,TP,EAName,Magic, 0 , Blue );	//-- this stores the value for Ticket, but it never gets used.. 
                                                                                        //-- you can simply call OrderSend() without storing the result 

   return ;    //--- void means the function returns no argument.. thus, no parentheses for return
}

void OpenSellOrder( double StopLoss, double TakeProfit)
{
         int Ticket;
         double SL,TP,SLP,TPP,OPP;
         
         if (HideSL==false && StopLoss> 0 ){SL=Bid+StopLoss* Point ;}
         else {SL= 0 ;}
         
         if (SL> 0 && SL<(Ask+MarketInfo( Symbol (),MODE_STOPLEVEL)* Point )){SL=Ask+MarketInfo( Symbol (),MODE_STOPLEVEL)* Point ;}
         
         if (HideTP==false && TakeProfit> 0 ){TP=Bid-TakeProfit* Point ;}
         else {TP= 0 ; /*TPP=0;*/ }
         
         Ticket= OrderSend ( Symbol (),OP_SELL,Lots,Bid,Slippage,SL,TP,EAName,Magic, 0 , Red );
         
     return ; 
}

GetSignal işlevinize dayanarak, aslında bir argüman döndürmek yerine sadece bir sipariş açmak için OpenBuy/SellOrder() kullanmak istiyorsunuz gibi görünüyor .. GetSignal() işlevinizi bazı yorumlarla biraz temizledim

 void GetSignal( int MaxBuyOrders, double StopLoss, double TakeProfit) 		//--- Why make this function a bool??
{
   int Op_Buy,Op_Sell,Op_BuyStop,Op_SellStop,Op_BuyLimit,Op_SellLimit;
        
   int total = OrdersTotal();
  
   for ( int x=total- 1 ; x>= 0 ; x--)
   {
      OrderSelect(x, SELECT_BY_POS, MODE_TRADES);
       int type   = OrderType();
       bool result = false ;     //-- not used anywhere??
      
       if (type==OP_BUY)       Op_Buy++;
       if (type==OP_SELL)      Op_Sell++;
       if (type==OP_BUYSTOP)   Op_BuyStop++;
       if (type==OP_SELLSTOP)  Op_SellStop++;         
   }
  
   int limit= 1 ;		        //--- why define limit to 1 
   for ( int i= 1 ;i<=limit;i++)    //--- your for-loop will always run once, in which case why even have a for-loop?
   {
       double MA1=iMA(NULL, 0 , 100 , 0 , 1 , 0 , 0 );
       double MA2=iMA(NULL, 0 , 100 , 0 , 1 , 0 , 1 );
       double MA3=iMA(NULL, 0 , 40 , 0 , 1 , 0 , 0 );
       double MA4=iMA(NULL, 0 , 40 , 0 , 1 , 0 , 1 );
      
       bool BUY= false ;   //-- as one guy mentioned better to go with booleans here
       bool SELL= false ;

       if (MA1 < MA3 && MA2 > MA4) BUY= true ;  
       if (MA1 > MA3 && MA2 < MA4) SELL= true ;
       // missed out  && total == 0 for now
       bool SignalBUY= false ;
       bool SignalSELL= false ;
      
       if (BUY) //-- dont need to write == for bool's ..BUY is same as BUY==true, !BUY same as BUY==false
       if (ReverseSystem) SignalSELL= true ;
       else SignalBUY= true ;
      
       if (SELL)
       if (ReverseSystem) SignalBUY= true ;
       else SignalSELL= true ;
      
       if (SignalBUY && Op_Buy < MaxBuyOrders )   OpenBuyOrder(StopLoss,TakeProfit); 	//--- no need to return the return of OpenBuyOrder().. simply calling it will run the code
       if (SignalSELL && Op_Sell < MaxSellOrders) OpenSellOrder(StopLoss,TakeProfit);	//-- same
   }
   return ;
}
 
supertrade :

OpenBuyOrder() ve OpenSellOrder() işlevleri aslında bir sonuç döndürmediği için bu hatayı alıyorsunuz .. onları void olarak tanımladınız, yani herhangi bir argüman döndürmediler, ancak bir tamsayı (0) döndürmeye çalışıyorsunuz.

işte bazı yorumlar içeren kod:

GetSignal işlevinize dayanarak, aslında bir argüman döndürmek yerine sadece bir sipariş açmak için OpenBuy/SellOrder() kullanmak istiyorsunuz gibi görünüyor .. GetSignal() işlevinizi bazı yorumlarla biraz temizledim

Bu tonlarca açıklıyor çok teşekkür ederim şimdi deniyorum

kendi kodum biraz karışık çünkü temelde diğer EA'lardan kopyalıyorum ve çalışmasını sağlamaya çalışıyorum.

 
sorun değil.. başka sorunlarla karşılaşırsanız sormaktan çekinmeyin
 
void MoveTrailingStop()
{
   int cnt,total= OrdersTotal ();
   for (cnt= 0 ;cnt<total;cnt++)
   {
       OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES);
       if (OrderType()<=OP_SELL  &&  OrderSymbol()== Symbol () ) //&&  OrderMagicNumber()==Magic
      {
         if (OrderType()==OP_BUY)
         {
             if (TrailingStop> 0 )  
            {                 
               if (( NormalizeDouble (OrderStopLoss(), Digits )< NormalizeDouble (Bid- Point *(TrailingStop+TrailingStep), Digits )) || (OrderStopLoss()== 0 ))
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble (Bid- Point *TrailingStop, Digits ),OrderTakeProfit(), 0 , Blue );
                   return ( 0 );
               }
            }
         }
         else 
         {
             if (TrailingStop> 0 )  
            {                 
               if (( NormalizeDouble (OrderStopLoss(), Digits )>( NormalizeDouble (Ask+ Point *(TrailingStop+TrailingStep), Digits )))||(OrderStopLoss()== 0 ))
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble (Ask+ Point *TrailingStop, Digits ),OrderTakeProfit(), 0 , Red );
                   return ( 0 );
               }
            }
         }
      }
   }
}
süper ticaret:
sorun değil.. başka sorunlarla karşılaşırsanız sormaktan çekinmeyin

Takip eden durmalara ilişkin birçok örnek topladım, ancak -ve değerleri boyunca 0'a kadar hemen izlemeye başlayan ve sonra bir mola gibi duran bir taneye ihtiyacım var.

yani, piyasaya giriş fiyatı alınır ve zararı durdurma 100 ise, fiyat +25'e hareket eder, takip eden durdurma -75'e hareket eder ve ardından fiyat 100'e ulaştığında, takip eden durdurma 0'da durur ve daha fazla hareket etmez .

bu konuda bana yardımcı olabilecek var mı? Bütün günümü işe almak için harcadım ve yapamıyorum.

Yaptığımı sanıyordum ama yapmadım, sondaki durağım 0'ı takip ediyor.

 

Sözde Kod:

 OrderSelect ()

if (Buyorder and stoploss < openrice) : we need to trail
if (Sellorder and stoploss > openprice): we need to trail
if (we need to trail):
Modify Stoploss to Currentprice (+ or -) original stoploss
 

zzuegg:

if (Buyorder ve stoploss < openrice) : takip etmemiz gerekiyor

zararı durdurma her zaman açık fiyattan daha düşük olmaz mı, ya da tam tersi?

Sonunda bir MaxLoss işlevi kullanmayı planlıyorum, bu yüzden OrderSend ile stop loss koymayacağım.

eğer Op_Buy

teklif <= OpenOrderPrice()+(Sondaki durma değeri) : iz -- bir kez teklif verdikten sonra > TSV hareket etmeye devam etmemeli mi?

ve

eğer Op_Sat

eğer sor >= OpenOrderPrice()-(Sondaki durma değeri): iz ?

O zaman Trailingstop'tan daha yüksek bir değerde Breakeven işi bitirebilir mi?

 OrderSelect (SELECT_BY_POS,MODE_TRADES);
   if (TrailingStop> 0 )
      {
       if (OrderType()==OP_BUY)
            {
             if ( Bid <= (OrderOpenPrice()+ Point *TrailingStop)  )
               {
                  MoveTrailingStop();
               }
            }
       if (OrderType()==OP_SELL)
            {   
             if ( Ask >= (OrderOpenPrice()- Point *TrailingStop) )
               {
                  MoveTrailingStop();
               }
            }
      }
BTW thanks zzuegg, thats another order management milestone achieved. What can happen with a little help. I am gratefull.
 
MickGlancy :

zzuegg:

if (Buyorder ve stoploss < openrice) : takip etmemiz gerekiyor

zararı durdurma her zaman açık fiyattan daha düşük olmaz mı, ya da tam tersi? Hayır, sadece başabaştan önce

Kodunuzun işe yaradığını sanmıyorum, tam tersini yapmaya çalışıyorsunuz gibi görünüyor ...
 
zzuegg :
Kodunuzun çalıştığını sanmıyorum, tam tersini yapmaya çalışıyorsunuz gibi görünüyor ...

hayır, mükemmel çalışıyor. Kontrol edeyim, şimdi bu yanıttakiyle aynı.

Hareket eden bir ticaretin arkasındaki kayıp boşluğunu kapatma konusunda bir uzlaşmaya varabileceğim kadar yakın, ancak yine de ona nefes alması için alan veriyor. Bundan önce, BE gerçekleşmeden önce ticaretin 60 puana ulaşması gerekiyordu, bu yüzden bir çok maksimum durdurulan ticaret vardı, bu da düşüşümün yüksek olmasına neden oldu. umarım bu bunu değiştirir.

 OrderSelect (SELECT_BY_POS,MODE_TRADES);
   if (TrailingStop> 0 )
      {
       if (OrderType()==OP_BUY)
            {
             if ( Bid <= (OrderOpenPrice()+ Point *TrailingStop)  )
               {
                  MoveTrailingStop();
               }
            }
       if (OrderType()==OP_SELL)
            {   
             if ( Ask >= (OrderOpenPrice()- Point *TrailingStop) )
               {
                  MoveTrailingStop();
               }
            }
      }
Neden: