Ücretsiz bir danışman yazacağım - sayfa 18

 

Yardıma ihtiyacım var.

http://forum.mql4.com/ru/67309#1011467

Помогите добавить к текущему советник пирамидинг. - MQL4 форум
  • www.mql5.com
Помогите добавить к текущему советник пирамидинг. - MQL4 форум
 

Söyle bana: siparişler her gün açılmıyor, takip çalışmıyor ve açık siparişler TP'ye göre kapatılmıyor. Neyi yanlış yaptım?


input int    StartHour    = 23;    // Время ачало торговли
input int    TakeProfit   = 40;    // TakeProfit
input int    StopLoss     = 40;    // StopLoss
input int    Lots         = 0.1;   // Лот для торговли
input int    Magic        = 22;    // Магическое число
input int    Trals        = 20;    // Дистанция тралинга в пунктах
input int    _Step        = 1;     // Шаг
input bool   _StepUse     = true;  // Использовать шаг или нет

void OnTick()
{
   static bool IsFirstTick = false;
   static int ticket = 0;
  
   double lot=Lot_Normalize(Symbol(),Lots,1);
   double sl= Dist_Normalize(Symbol(),Trals);
   double step= Dist_Normalize(Symbol(),_Step);
  
   int h= TimeHour(TimeCurrent());
   if(h == StartHour)
   {
    Alert("TimeHor: ", h);
    if (IsFirstTick == true)
      IsFirstTick = false;
     
      bool res;
      res= OrderSelect(ticket, SELECT_BY_TICKET);
      if(res == true)
      {
         if(OrderCloseTime() == 0)
         {
            bool res2;
            res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10);
           
            if(res2 == false)
            {
               Alert("Error Closing Order #", ticket);
               } Alert("Closing Order #", ticket);
         }  
      }
       if(Open[0] < Open[StartHour])
      {
         ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot");
         Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
         if(ticket < 0)
         {
           Alert("Error Sending Order!");
         } Alert("Sending Order! BUY_LIMIT");
       }
       else
       {
         ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot");
         Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
         if(ticket < 0)
         {
           Alert("Error Sending Order!");
         } Alert("Sending Order! SEL_LLIMIT");
    }  
}
 
}  

double Dist_Normalize(string Smv, int _Distancia)
{
 int Dig= int(MarketInfo(Smv,MODE_DIGITS));
 double Pip=MarketInfo(Smv,MODE_POINT);
 if(Dig==3 || Dig==5)
   return NormalizeDouble(_Distancia*10*Pip,Dig);
 else return NormalizeDouble(_Distancia*Pip,Dig);
 } 


double Lot_Normalize(string Smv, double _lot, double _mult)
{
 double minlot=MarketInfo(Smv,MODE_MINLOT);
 double maxlot=MarketInfo(Smv,MODE_MAXLOT);
 double steplot=MarketInfo(Smv,MODE_LOTSTEP);
 double lot= _lot*_mult;
 if(lot<=minlot) lot+minlot;
 else if(lot>=maxlot) lot=minlot;
 else if(lot>minlot && lot<maxlot)
  {
    int k=int((lot-minlot)/steplot);
    lot=NormalizeDouble(minlot+k*steplot,2);
  }
  return(lot);




void Tralling_Stop(string Smv, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
  int Dig=int(MarketInfo(_Symbol,MODE_DIGITS));
  for(int pos=OrdersTotal()-1; pos>=0;pos--)
    {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Smv &&
      OrderMagicNumber()==_Magic && OrderType()<2)
        {
          double SLPrice;
          if(OrderType()==OP_BUY)
            {
              if(_Step_Use)
              {
                RefreshRates();
                if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
                {
                  SLPrice=NormalizeDouble(Ask-_Tral,Dig);
                  if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
                   Alert("Error modifi Order!: ",GetLastError());
                  }
                 }
               else
                 {
                  RefreshRates();
                  if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
                    {
                     SLPrice=NormalizeDouble(Bid+_Tral,Dig);
                     if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
                     Alert("Error modifi Order!: ",GetLastError());
                 }
             }
          }
       }
    }
 }            

 
MIR_KAZAN :

Söyle bana: siparişler her gün açılmıyor, takip çalışmıyor ve açık siparişler TP'ye göre kapatılmıyor. Neyi yanlış yaptım?


input int    StartHour    = 23;    // Время ачало торговли
input int    TakeProfit   = 40;    // TakeProfit
input int    StopLoss     = 40;    // StopLoss
input int    Lots         = 0.1;   // Лот для торговли
input int    Magic        = 22;    // Магическое число
input int    Trals        = 20;    // Дистанция тралинга в пунктах
input int    _Step        = 1;     // Шаг
input bool   _StepUse     = true;  // Использовать шаг или нет

void OnTick()
{
 ......
 

     if (IsFirstTick == doğru)

IsFirstTick = yanlış;

değiştireceğim parça bu

 if (TM!=Time[ 0 ])
{
   TM = Time[ 0 ];
......
}

burada TM değişkeni, OnTick() işlevinin dışında DateTime olarak bildirilir, yani bu modül için globaldir.

Bu kod net değil: if(Open[0] < Open[StartHour])

Başlangıç Saatiniz 23'e eşittir ve sıfır çubuğunun açılış fiyatını 23. çubuğun geri açılış fiyatı ile karşılaştırdığınız ortaya çıktı. Pekala, tamam, belki bu danışmanın böyle bir özelliğidir.

Ama bu tasarım hiç çalışmıyor.

      res= OrderSelect (ticket, SELECT_BY_TICKET);
       if (res == true )
      { 
         if (OrderCloseTime() == 0 )
         {
             bool res2;
            res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10 );
            
             if (res2 == false )
            {
               Alert ( "Error Closing Order #" , ticket);
               } Alert ( "Closing Order #" , ticket);
         }   
      }

Ve bilet değişkeniniz sıfıra eşitse veya danışman yeniden başlatıldıysa ve bu değişken varsayılan olarak sıfırlandıysa?

 
StartHour, EA'nın çalışması gereken zamandır. Orada gece yarısı olmalı. Trollük neden çalışmıyor?
 
MIR_KAZAN :
StartHour, EA'nın çalışması gereken zamandır. Orada gece yarısı olmalı. Trolleme neden çalışmıyor?

Neden çalışmadığını anlamak için kodu analiz etmek gerekir.

Yazdır (" Tralling_Stop ") işlevini Tralling_Stop () işlevine eklemeyi deneyin ve bu mesajın (Tralling_Stop) günlükte olup olmadığına bakın, yoksa bu işlev çağrılmaz. Öyleyse, Tralling_Stop() işlevinin kendisini analiz edin, belki içinde bazı mantıksal hatalar vardır.

Genel olarak, nerede mantıksal if koşulları varsa, Yazdır(" koşul 1" çalıştı), Yazdır(" koşul 2" çalıştı), vb. Test cihazında Expert Advisor'ı çalıştırdığınızda, Expert Advisor'ın mantığını günlükte takip edebileceksiniz.

 
vitales :

Neden çalışmadığını anlamak için kodu analiz etmek gerekir.

Yazdır (" Tralling_Stop ") işlevini Tralling_Stop () işlevine eklemeyi deneyin ve bu mesajın (Tralling_Stop) günlükte olup olmadığına bakın, yoksa bu işlev çağrılmaz. Öyleyse, Tralling_Stop() işlevinin kendisini analiz edin, belki içinde bazı mantıksal hatalar vardır.

Genel olarak, nerede mantıksal if koşulları varsa, Yazdır(" koşul 1" çalıştı), Yazdır(" koşul 2" çalıştı), vb. Test cihazında Expert Advisor'ı çalıştırdığınızda, Expert Advisor'ın mantığını günlükte takip edebileceksiniz.


Yeniden yazmaya çalıştım ama yine de istediğim gibi çalışmıyor. Gerektiğinde ya emirler açılmıyor ya da trol yapmıyor. Fikire göre, danışman şöyle çalışmalıdır: Günün son mumunun kapanışında (bu saat 00:00'da), Yüksek (alış için) ve Düşük için iki gecikme açmalıdır. (bir köy için) ve sonra onları trolleyin. bir gün sonra her şey tekrar eder.

input int     StartHour    = 1;     // Начало торговли
input int     TakeProfit   = 40;    // TakeProfit
input int     StopLoss     = 10;    // StopLoss
extern double Lots         = 0.1;   // Лот для торговли
input int     Magic        = 22;    // Магическое число
input int     Trals        = 5;     // Дистанция тралинга в пунктах
input int     _Step        = 1;     // Шаг
input bool    _StepUse     = false; // Использовать шаг или неT

void OnTick()
{
   static bool IsFirstTick = false;
  
   Trailing();
  
   if (StartHour != Hour()) { return;}
   if (OrdersTotal()>0)
   {
    OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
    OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);                    
   }
}           

//+------------------------------------------------------------------+ 
void Trailing()
{
  if (_StepUse)
{
  for (int trall=0; trall<OrdersTotal(); trall++) {
    if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;      
 
    if (OrderType() == OP_BUY ) {
      if (Bid-OrderOpenPrice() > StopLoss*Point || OrderMagicNumber()==Magic) {
        if (OrderStopLoss() < Bid-(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-StopLoss*Point, OrderTakeProfit(), 0, Blue);
       }
      }
    }
 
    if (OrderType() == OP_SELL) {
     if (OrderOpenPrice()-Ask > StopLoss*Point || OrderMagicNumber()==Magic) {
        if (OrderStopLoss() > Ask+(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+StopLoss*Point, OrderTakeProfit(), 0, Blue);
        }
     }
    }
  }
 }
}
//+------------------------------------------------------------------+

 
MIR_KAZAN :

Denemek

 if (StartHour != Hour()) { return ;} 

İle ikame edilmiş:

 if (StartHour != TimeHour(Time[ 0 ])) { return ;} //Если час текущей свечи не равен StartHour то выход из функции и тогда ниже написанный код выполнятся не будет, в том числе и трейлинг стоп. 
 if ( OrdersTotal ()> 0 )
{
....
}

ile ikame edilmiş:

 if ( OrdersTotal ()== 0 ) 
{
     bool rezult = false ;
    rezult= OrderSend ( Symbol (), OP_BUYLIMIT, Lots, High[ 1 ], 10 , Low[ 1 ]-StopLoss* Point , High[ 1 ]+TakeProfit* Point , "Set bu ForexRobot" ,Magic);
     if (!rezult) Print ( "Ошибка открытия ордера BUY LIMIT" );
    rezult = OrderSend ( Symbol (), OP_SELLLIMIT, Lots, Low[ 1 ], 10 , High[ 1 ]+StopLoss* Point , Low[ 1 ]+TakeProfit* Point , "Set bu ForexRobot" ,Magic);
     if (!rezult) Print ( "Ошибка открытия ордера SELL LIMIT" ); 
//для работы в реале надо сделать более детальную проверку ошибок 

} else Trailing();

Ayrıca , NormalizeDouble() işlevi kullanılarak fiyatlar normalleştirilmelidir. Yani Low[1]-StopLoss*Point yerine NormalizeDouble(Low[1]-StopLoss*Point,Digits()) yazmalısınız.

Ayrıca, kodunuza bakılırsa, _StepUse değişkeni yanlışsa, sondaki durdurma sizin için çalışmayacaktır. Trailing() fonksiyon koduna yakından bakın

 void Trailing()
{
   if ( _StepUse ) //если false то код внутри скобок выполнятся не будет.
  {
   ......

  }
}// Скорее всего вы этот код просто бездумно скопировали от куда нибудь, даже не понимая как он работает.
 
vitales :

Denemek

İle ikame edilmiş:

ile ikame edilmiş:

Ayrıca , NormalizeDouble() işlevi kullanılarak fiyatlar normalleştirilmelidir. Yani Low[1]-StopLoss*Point yerine NormalizeDouble(Low[1]-StopLoss*Point,Digits()) yazmalısınız.

Ayrıca, kodunuza bakılırsa, _StepUse değişkeni yanlışsa, sondaki durdurma sizin için çalışmayacaktır. Trailing() fonksiyon koduna yakından bakın

iletişim halinde misiniz? Bana yaz http://vk.com/computerwizard116. Artık danışmanın sorununu nasıl çözeceğimi bilmiyorum. Bir demo hesapta bu stratejiyle bir hafta çalıştım

ve çalışıyor. Ve test ederken, bu piç siparişleri bile kapatmıyor ((((((((((((((((((((((((((((((((((((((((((((((((((((

Bunu neden yapıyor?

Dosyalar:
 
MIR_KAZAN :

iletişim halinde misiniz? Bana yaz http://vk.com/computerwizard116. Artık danışmanın sorununu nasıl çözeceğimi bilmiyorum. Bir demo hesapta bu stratejiyle bir hafta çalıştım

ve çalışıyor. Ve test ederken, bu piç siparişleri bile kapatmıyor ((((((((((((((((((((((((((((((((((((((((((((((((((((

Bunu neden yapıyor?

Vkontakte'm yok.

Kâr al ve zararı durdur emirlerinin yürütülmesi danışmana bağlı değildir, komisyoncu sunucusunda yürütülür. EA yalnızca alma ve durdurmayı ayarlar, ancak bunları yürütmez. Fiyat bu değere ulaştıktan sonra kâr al ayarının yapılıp yapılmadığını kontrol edin. Yani, önce bir emir açıldı, ardından fiyat ileri geri yürüdü ve ardından bir kâr al belirlendi.

 
vitales :

Vkontakte'm yok.

Kâr al ve zararı durdur emirlerinin yürütülmesi danışmana bağlı değildir, komisyoncu sunucusunda yürütülür. EA yalnızca alma ve durdurmayı ayarlar, ancak bunları yürütmez. Fiyat bu değere ulaştıktan sonra kâr al ayarının yapılıp yapılmadığını kontrol edin. Yani, önce bir emir açıldı, ardından fiyat ileri geri yürüdü ve ardından bir kâr al belirlendi.

TP, OrderSend, Sl'ye nasıl eklenir, böylece SL, önceki mumun Yüksek'ini ve önceki + TakeProfit'in Düşük'ünden TP'yi içerir?
Neden: