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

 
deVries :


değil, mevcut yayılma ile test ederseniz, bu çok çılgınca bir harekettir, bu nedenle yayılma çok büyük olabilir

peki testi nasıl yaptın

sabit yayılma veya mevcut yayılma ??


tamam, bu yüzden google "spread" e gitme zamanım geldi

Aptal sorularıma cevap verdiğin için minnettarım))

birazdan döneceğim

 
prupru :


tamam, bu yüzden google "spread" e gitme zamanım geldi

Aptal sorularıma cevap verdiğin için minnettarım))

birazdan döneceğim

Yayılım = Sor - Teklif Ver
 

ve her tik bu değer değişebilir

yöntemi sormamın nedeni testi nasıl yaptın

 
deVries :

ve her tik bu değer değişebilir

yöntemi sormamın nedeni testi nasıl yaptın

kesinlikle!

Fark, mevcut spread testinden kaynaklanıyordu, testleri sabit spread ile yaptığımda tamamen aynıydı!

Çok teşekkürler çocuklar!

Gerçekten bilgimi geliştirdim.

Ve kodda iyileştirilmesi gereken bir şey varsa lütfen bana bildirin.

 
prupru :

kesinlikle!

Fark, mevcut spread testinden kaynaklanıyordu, testleri sabit spread ile yaptığımda tamamen aynıydı!

Çok teşekkürler çocuklar!

Gerçekten bilgimi geliştirdim.

Ve kodda iyileştirilmesi gereken bir şey varsa lütfen bana bildirin.


kodunuzun şimdi ne olduğunu gösterirseniz

ayrıca yeni bir hata işleme görmek ister, RaptorUK yorumuna bakın https://www.mql5.com/en/forum/148529

 
deVries :


kodunuzun şimdi ne olduğunu gösterirseniz

ayrıca yeni bir hata işleme görmek ister, RaptorUK yorumuna bakın https://www.mql5.com/en/forum/148529

Tamam, başlıyoruz:

 #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= 0 ;
extern int   StopLoss= 0 ;
extern int TrailingStop= 0 ;
extern int Slippage = 10 ;

extern double MinDiff = 0.002 ;

int LastBars = 0 ;
//0 - undefined, 1 - bullish cross (fast MA above slow MA), -1 - bearish cross (fast MA below slow MA)
int PrevCross = 0 ;

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

fiyat normalizasyonu:

 double NormPrice( double g_price)
{
   return ( NormalizeDouble (g_price, MarketInfo ( Symbol (), MODE_DIGITS )));
}

GetLot işlevi, sanırım değişmedi

 //function GetLot, get size of the lot according to MaxRisk
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);}

Yeni Sipariş işlevi, artık normalleştirilmiş fiyatları kullanıyor:

 //function NewOrder, place new order
int NewOrder( int Cmd, double Lot)
{ double TP= 0 ; //тейкпрофит
 double SL= 0 ; //стоплосс
 double PR= 0 ; //Цена
 color clr = CLR_NONE;
 while (! IsTradeAllowed ()) Sleep ( 10 );
 RefreshRates ();
 if (Cmd== OP_BUY )
   {PR= Ask ;
     if (TakeProfit> 0 ) TP=NormPrice( Ask + Ask *TakeProfit/ 100 );
     if (StopLoss> 0 ) SL=NormPrice( 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=NormPrice( Bid - Bid *TakeProfit/ 100 );
     if (StopLoss> 0 ) SL=NormPrice( 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());
   Print ( "cmd " , Cmd, " Lot " , Lot, " PR " , PR, " Slip " , Slippage, " SL " , SL, " TP " , TP, " Ask " , Ask , " Bid " , Bid );
  }
return (tic);}

1 veya tüm siparişleri kapat

Sembol ve sihirli sayıları kontrol etmek için sipariş kapatma fonksiyonunu değiştirmedim, çünkü sadece bir sembolde ve hesap başına sadece bir EA ile işlem yapacağım. Ama diğer daha önemli meseleleri hallettikten ve akort ettikten sonra yapacağım.

 //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 ( "Close order error: " ,GetLastError());
   Print ( "Type " , OrderType (), " PR " ,PR, " Ask " , Ask , " Bid " , Bid , " OrderTicket " , OrderTicket (), " OrderLots " , OrderLots ());
  }
return ;}
//--------------------------- end of close order

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

EMA çapraz algılamayı, EmaDiff[2] ile EmaDiff[1]'i karşılaştırmaktan, EmaDiff[0]'ı sıfıra karşılaştırmaya ve ek bir bayrak kullanmaya değiştirdim (bütün bunlar bulduğum bazı örneklerden geliyor)

Bir dakika ölçeğinde Demo hesabında, spread o kadar yüksek olduğunda yanlış tetikler yapar, bir satın alma anlaşması EMA'ları kesiştirir ve ardından aynı dakika çubuğu içinde bundan sonra gelen bir satış anlaşması onları tekrar ayırır.

[url=http://postimg.org/image/udq4ufmqf/][img]http://s15.postimg.org/udq4ufmqf/mess.jpg[/img][/url]

Şu an bununla nasıl başa çıkacağımı düşünüyorum

 // check cross
void CheckCross()
{
   double FMA_Current = iMA ( Symbol (), 0 ,FastEma, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   double SMA_Current = iMA ( Symbol (), 0 ,SlowEma, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   double Poin = (FMA_Current + SMA_Current)/ 2 ;
   double Lot;
   if (PrevCross == 0 ) //Was undefined
   {
       if ((FMA_Current - SMA_Current) >= MinDiff * Poin) PrevCross = 1 ; //Bullish state
       else if ((SMA_Current - FMA_Current) >= MinDiff * Poin) PrevCross = - 1 ; //Bearish state
       return ;
   }
   else if (PrevCross == 1 ) //Was bullish
   {
       if ((SMA_Current - FMA_Current) >= MinDiff * Poin) //Became bearish
      {
         CloseAllOrders();
         Lot = GetLot(MaxRisk);
         NewOrder( OP_SELL ,Lot);
         PrevCross = - 1 ;
      }
   }
   else if (PrevCross == - 1 ) //Was bearish
   {
       if ((FMA_Current - SMA_Current) >= MinDiff * Poin) //Became bullish
      {
         CloseAllOrders();
         Lot = GetLot(MaxRisk);
         NewOrder( OP_BUY ,Lot);
         PrevCross = 1 ;
      }
   }
}

takip eden durdurma işlevi:

 // trailing stop
void DoTrailing()
{
   int total = OrdersTotal ();
   for ( int pos = 0 ; pos < total; pos++)
   {
       if ( OrderSelect (pos, SELECT_BY_POS ) == false ) continue ;
       if ( OrderSymbol () == Symbol ())
      {
         if ( OrderType () == OP_BUY )
         {
             RefreshRates ();
             if ( Bid - OrderOpenPrice () >= TrailingStop * Bid / 100 ) //If profit is greater or equal to the desired Trailing Stop value
            {
               if ( OrderStopLoss () < ( Bid - TrailingStop * Bid / 100 )) //If the current stop-loss is below the desired trailing stop level
                   OrderModify ( OrderTicket (), OrderOpenPrice (), NormPrice( Bid - TrailingStop * Bid / 100 ), OrderTakeProfit (), 0 );
            }
         }
         else if ( OrderType () == OP_SELL )
         {
             RefreshRates ();
             if ( OrderOpenPrice () - Ask >= TrailingStop * Ask / 100 ) //If profit is greater or equal to the desired Trailing Stop value
            {
                       if (( OrderStopLoss () > ( Ask + TrailingStop * Ask / 100 )) || ( OrderStopLoss () == 0 )) //If the current stop-loss is below the desired trailing stop level
                   OrderModify ( OrderTicket (), OrderOpenPrice (), NormPrice( Ask + TrailingStop * Ask / 100 ), OrderTakeProfit (), 0 );
            }
         }
      }
   }   
}

ve vücudun kendisi:

 //main program
int start()
  {

   if (TrailingStop > 0 ) DoTrailing();
          
         static datetime Time0;
         if (Time0 == Time [ 0 ]) return ;
        Time0 = Time [ 0 ];
      {
       CheckCross();     
              
      }

   return ( 0 );
  }

İlginiz için teşekkürler!

 
prupru :


Sembol ve sihirli sayıları kontrol etmek için sipariş kapatma fonksiyonunu değiştirmedim, çünkü sadece bir sembolde ve hesap başına sadece bir EA ile işlem yapacağım. Ama diğer daha önemli meseleleri hallettikten ve akort ettikten sonra yapacağım.


tembel olmayın, doğrudan yapın !!!!

her zaman dahil etmeniz gereken önemli bir şey

programınızı düzeltmek istiyorsanız ve yapmanız gerekenleri tavsiye ediyoruz

o zaman düzeltmek için çalışmak istemiyorsan o zaman sana yardım etmek için ne yapıyoruz ??

 
deVries :


tembel olmayın, doğrudan yapın !!!!

her zaman dahil etmeniz gereken önemli bir şey

programınızı düzeltmek istiyorsanız ve yapmanız gerekenleri tavsiye ediyoruz

o zaman düzeltmek için çalışmak istemiyorsan o zaman sana yardım etmek için ne yapıyoruz ??


tamam tamam sakin ol)

işte burada, bence bu hile yapmalı.

açık sipariş fonksiyonu:

 OrderSend ( Symbol (),Cmd,Lot,PR,Slippage,SL,TP, "" ,Expert_ID, 0 ,clr);

tüm sipariş fonksiyonunu kapat:

//Close all Orders
void CloseAllOrders()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
   {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == Expert_ID))  CloseOrder();
     }
    else
     {
      Print("Error selecting order: ",GetLastError());
      Print(" i= ", i, " Symbol= ", OrderSymbol());
     }
   }
return;}
 

Şimdi daha büyük bir sorunum var, brokerim emirleri kısmen yerine getirme eğiliminde.

Sayın Müşteri,

Lütfen ticaretinizin 587.318 fiyatından kısmen açıldığını (15.84 üzerinden 2.32 lot) dikkate alınız.

Bu konuyla ilgili başka sorularınız varsa, bizimle iletişime geçmekten çekinmeyin.

Saygılarımla,

Komisyoncu.

İşte destek ne diyor:

Yüksek oynaklık veya düşük likidite dönemlerinde Limit Emirlerinin kısmen uygulanabileceğini lütfen unutmayın. Bu, fiyatın karşılanması durumunda pozisyonun hemen tamamen veya kısmen doldurulacağı anlamına gelir. Siparişinizin kısmen yerine getirilmesi durumunda, bu nedenle tebligat mektubu aldınız.

Kısmen kapalı olmalarına rağmen tüm siparişleri nasıl kapatacağımı anlıyorum, OrdersTotal()> 0 iken Tüm Siparişleri Kapat yapmam gerekiyor, ancak siparişler kısmen açıldığında henüz ne yapacağımı bilmiyorum.

Düzenle:

Doğru Sembol ve sihirli sayı siparişlerini kontrol etmem gerektiğini yeni fark ettim, bu biraz daha zor

edit: işte kısmi kapanışta bile emirleri kapatması gereken tüm emirleri kapat fonksiyonu

 //Close all my Orders
void CloseAllOrders()
{
int notMyOrders = 0 ;

for ( int j= OrdersTotal ()- 1 ;j>= 0 ;j--)
{
     if ( OrderSelect (j, SELECT_BY_POS , MODE_TRADES ))
      {
       if (( OrderSymbol () != Symbol ()) || ( OrderMagicNumber () != Expert_ID)) notMyOrders++;
      }
     else
      {
       Print ( "Error selecting order: " ,GetLastError());
       Print ( " j= " , j, " Symbol= " , OrderSymbol ());
      }    
}

 while ( OrdersTotal ()>notMyOrders)
 {
   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
   {
     if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
     {
       if (( OrderSymbol () == Symbol ()) && ( OrderMagicNumber () == Expert_ID))  CloseOrder();
     }
     else
     {
       Print ( "Error selecting order: " ,GetLastError());
       Print ( " i= " , i, " Symbol= " , OrderSymbol ());
     }
   }
 }


return ;}
 

Açık emirlerin kısmi yürütülmesiyle nasıl mücadele edeceğim,

Açılış emri artık NewOrder işleviyle gerçekleştirilmeyecek, ancak bununla yapılacak:

 //OpenOrders in case of partial execution
int OpenPartOrders( int Cmd, double Lot)
{
 int NumOrders = 0 ;
 int LastTic = - 1 ;
 double Step = MarketInfo ( Symbol (), MODE_LOTSTEP );
 double LotRemains = Lot;
 
 //MathFloor( /Step)*Step;;
while (LotRemains> 0 )
 {
  LastTic = NewOrder(Cmd, LotRemains);
  NumOrders++;
   if ( OrderSelect (LastTic, SELECT_BY_TICKET )== true )
     {
      LotRemains = LotRemains - OrderLots();
       Print ( "NumberOfOrders " , NumOrders, " Ticket " , LastTic, " LotRemains " , LotRemains, " initial Lot " , Lot);          
     }
   else
   {
     Print ( "OrderSelect returned the error of " ,GetLastError());
    LotRemains = 0 ;//not to create an endless loop opening new orders again and again
   }
 } 
return (NumOrders);}