2 EMA çapraz EA yaptı, tavsiyeye ihtiyacım var

 

Merhaba!

mql 4'te yeniyim ve basit bir 2 EMA çapraz danışmanı yaptım, bunu demo hesabında test ettim, ancak gerçek bir hesapta almaktan biraz korktum

1 saat ölçeğinde küçük partilerle test etmek çok fazla zaman alır ve dakika ölçeğinde test etmek pahalıdır, çünkü brokerimdaki minimum lot yaklaşık 7 usd'dir.

Bu nedenle, bir göz atarsanız ve yapmış olabileceğim bazı bariz hatalara işaret edebilirseniz minnettar olurum.

Bu danışmanın son derece değişken olan Bitcoin/USD piyasasında işlem yapması gerekiyor (fiyat günde + - %30'a kadar gidebilir), bu nedenle zararı durdur ve kar al pip olarak değil, bir teklif veya talebin yüzdeleri cinsindendir.

Değişkenler ve şeyler:

 #property copyright "me"
#property link        "killnosock.net"
extern int SlowEma = 21 ;
extern int FastEma = 10 ;
extern int MaxRisk = 100 ; // % of Depo to be traded per order
extern int   TakeProfit= 100 ;
extern int   StopLoss= 100 ;
extern int Slippage = 10 ;

int LastBars = 0 ;

int init(){ return ( 0 );}
int deinit() { return ( 0 );}

Bu fonksiyon, sipariş başına kullanımına izin verilen depo yüzdesine göre parti büyüklüğünü belirlemek içindir (int Risk)

 double GetLot( int Risk)
{ double Free    = AccountFreeMargin ();
 double One_Lot = MarketInfo ( Symbol (), MODE_MARGINREQUIRED );
 double Min_Lot = MarketInfo ( Symbol (), MODE_MINLOT );
 double Max_Lot = MarketInfo ( Symbol (), MODE_MAXLOT );
 double Step    = MarketInfo ( Symbol (), MODE_LOTSTEP );
 double Lot     = MathFloor (Free*Risk/ 100 /One_Lot/Step)*Step;
 if (Lot<Min_Lot) Lot=Min_Lot;
 if (Lot>Max_Lot) Lot=Max_Lot;
 if (Lot*One_Lot>Free) {
 Alert ( " free= " , AccountFreeMargin (), " for one lot= " , MarketInfo ( Symbol (), MODE_MARGINREQUIRED ), " lot= " , Lot);
 return ( 0.0 );}
return (Lot);}

Bu yeni emir açan fonksiyondur, Cmd al veya sat

 int NewOrder( int Cmd, double Lot)
{ double TP= 0 ; //takeprofit
 double SL= 0 ; //stoploss
 double PR= 0 ; //price
 color clr = CLR_NONE;
 while (! IsTradeAllowed ()) Sleep ( 10 );
 RefreshRates ();
 if (Cmd== OP_BUY )
   {PR= Ask ;
     if (TakeProfit> 0 ) TP= Ask + Ask *TakeProfit/ 100 ;
     if (StopLoss> 0 ) SL= Ask - Ask *StopLoss/ 100 ;
     if (SL< 0 ) SL = 0 ;
     if (TP< 0 ) TP = 0 ;
    clr = Green;}
 if (Cmd== OP_SELL )
   {PR= Bid ;
     if (TakeProfit> 0 ) TP= Bid - Bid *TakeProfit/ 100 ;
     if (StopLoss> 0 ) SL= Bid + Bid *StopLoss/ 100 ;
     if (SL< 0 ) SL = 0 ;
     if (TP< 0 ) TP = 0 ;
    clr = Red;}
 int tic= OrderSend ( Symbol (),Cmd,Lot,PR,Slippage,SL,TP, "" , 0 , 0 ,clr);
 if (tic< 0 ) Print ( "Open order error: " ,GetLastError());
return (tic);}

Burada 1 siparişi kapatıyorum veya tüm siparişleri kapatıyorum:

 //CloseOrder
void CloseOrder()
{ double PR= 0 ;
 while (! IsTradeAllowed ()) Sleep ( 10 );
 RefreshRates ();
 if ( OrderType ()== OP_BUY )  PR= Bid ;
 if ( OrderType ()== OP_SELL ) PR= Ask ;
 if (! OrderClose ( OrderTicket (), OrderLots (),PR,Slippage,CLR_NONE))
   Print ( "Order close error: " ,GetLastError());
return ;}
 //Close all Orders
void CloseAllOrders()
{
   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
   if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
     {
      CloseOrder();
     }
return ;}

Bu fonksiyon, hızlı ve yavaş EMA farkını hesaplamak için kullanılır (hızlı EMA - yavaş EMA):

 double EmaDiff( int shift)
   {
       double difference;
      difference = iMA ( Symbol (), 0 ,FastEma, 0 , MODE_EMA , PRICE_CLOSE ,shift)
                 - iMA ( Symbol (), 0 ,SlowEma, 0 , MODE_EMA , PRICE_CLOSE ,shift);
       return (difference);
   }

Ve işte ana gövde:

 int start()
  {
double Lot;
    // check if new bar opened
     if (LastBars == Bars ) return ( 0 );
     else LastBars = Bars ;
      {         
         if ((EmaDiff( 1 ) > 0 ) && (EmaDiff( 2 ) < 0 ))
            {
               CloseAllOrders();
               Lot = GetLot(MaxRisk);
               NewOrder( OP_BUY ,Lot);
            }
            
         if ((EmaDiff( 2 ) > 0 ) && (EmaDiff( 1 ) < 0 ))
            {
               CloseAllOrders();
               Lot = GetLot(MaxRisk);
               NewOrder( OP_SELL ,Lot);
            }                    
      }
   return ( 0 );
  }

Sondaki bir durak ekleyeceğim ve yavaş ve hızlı EMA birbirine çok yaklaştığında ve her çubuğu kesiştiğinde kesilmemek için EmaDiff'i sıfırla değil, bazı küçük değerlerle karşılaştırmayı düşünüyorum.

 
 //CloseOrder
void CloseOrder()
{ double PR= 0 ;
 while (! IsTradeAllowed ()) Sleep ( 10 );
 RefreshRates ();
 if ( OrderType ()== OP_BUY )  PR= Bid ;
 if ( OrderType ()== OP_SELL ) PR= Ask ;
 if (! OrderClose ( OrderTicket (), OrderLots (),PR,Slippage,CLR_NONE))
   Print ( "Order close error: " ,GetLastError());
return ;}



//Close all Orders
void CloseAllOrders()
{
   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
   if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
     {
      CloseOrder();
     }
return ;}

sembolü kontrol etmiyor bir sihirli sayıyı kontrol etmiyor ....

o zaman üzerinde farklı EA'lar ile canlı kullanarak ne olacak ???

 
deVries :

sembolü kontrol etmiyor bir sihirli sayıyı kontrol etmiyor ....

o zaman üzerinde farklı EA'lar ile canlı kullanarak ne olacak ???


1 hesaptan iki EA çalıştırmayı mı kastediyorsunuz?
 
prupru :

1 hesaptan iki EA çalıştırmayı mı kastediyorsunuz?
İki EA veya bir EA ve manuel olarak yerleştirilen işlemler. . . veya sadece manuel olarak yerleştirilen işlemler.
 
prupru :

Merhaba!

mql 4'te yeniyim ve basit bir 2 EMA çapraz danışmanı yaptım, bunu demo hesabında test ettim, ancak gerçek bir hesapta almaktan biraz korktum

1 saat ölçeğinde küçük partilerle test etmek çok fazla zaman alır ve dakika ölçeğinde test etmek pahalıdır, çünkü brokerimdaki minimum lot yaklaşık 7 usd'dir.

Bu nedenle, bir göz atarsanız ve yapmış olabileceğim bazı bariz hatalara işaret edebilirseniz minnettar olurum.

Birinin sizden istenmeden ticaret işlevi dönüş değerlerini kontrol ettiğini görmek güzel. . . ancak soruna neyin neden olduğunu teşhis edebilmeniz için bir hata alırsanız daha fazla bilgiye ihtiyacınız var, o sırada Yayılmanın ne olduğunu veya Donma seviyesinin ne olduğunu kontrol etmek için canlı durumda zamanda geriye gidemiyorsunuz. . .

 if (tic < 0 ) Print ( "Open order error: " , GetLastError());

. . . bu iyi ama daha fazlasına ihtiyacınız var, aldığınız herhangi bir hatanın nedenini belirleyebilmek için hangi değişkenleri yazdırmanız gerekecek? neye ihtiyacınız olabileceğini belirlediğinizde, Ask, Bid, vb. gibi çift değişkenler için doğru sayıda ondalık basamak (DoubeToStr(değer, basamak)) kullandığınızdan emin olarak hepsini Print() çağrınıza ekleyin.

 
RaptorUK :

Birinin sizden istenmeden ticaret işlevi dönüş değerlerini kontrol ettiğini görmek güzel. . .

Üzgünüm ama o kısmı anlamadım. Elimdeki tek şey, Print() çağrısına olabildiğince çok değişken eklemem gerektiğidir. Puan alındı, teşekkürler.

deVries, tavsiyen için de teşekkürler, şimdi ne demek istediğini anladım.

Düzeltilmesi gereken başka bir şey var mı?

 

elbette var

     // check if new bar opened
     if (LastBars == Bars ) return ( 0 );
     else LastBars = Bars ;

zaten maksimum çubuklarınız olduğunu varsayalım (bir sınır vardır).....

 
deVries :

elbette var

zaten maksimum çubuklarınız olduğunu varsayalım (bir sınır vardır).....


tamam, yeni bir mumun açıldığı anı nasıl daha iyi yakalayabilirim?
 
prupru :

tamam, yeni bir mumun açıldığı anı nasıl daha iyi yakalayabilirim?


son çubuğun saatini kontrol et Time[0]

NewBar'ı arayın ve bazı örnekler bulun

 
deVries :


en son çubuğun saatini kontrol et Time[0]

NewBar'ı arayın ve bazı örnekler bulun


teşekkürler, bunu buldum https://www.mql5.com/en/code/10370

 
 if (Cmd== OP_BUY )
   {PR= Ask ;
     if (TakeProfit> 0 ) TP= Ask + Ask *TakeProfit/ 100 ;
     if (StopLoss> 0 ) SL= Ask - Ask *StopLoss/ 100 ;
     if (SL< 0 ) SL = 0 ;
     if (TP< 0 ) TP = 0 ;
    clr = Green;}

bunun doğru olduğunu düşünmüyorum

100 pips kar alma ve 150 pips Stoploss'u nasıl elde edersiniz ???

güncellemeye bakın " bu yüzden zararı durdur ve kârı al pip cinsinden değil, bir teklif veya teklifin yüzdeleri cinsindendir."

yine de bu şekilde geçerli bir fiyat alıyor musunuz ... sembolünüz 5 basamaklıysa sonuç genellikle 2 basamak daha fazla olacaktır

Neden: