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

 
Vitalii Ananev :

D1 mumunu açarken alım satım açacağını mı söylüyorsunuz? Öyleyse, danışmanın mantığına göre, yalnızca belirli bir zamanda anlaşmaları açma koşullarını ayarlayın.

Açık. ve bu soru: Buystop ve selstop fiyatlarından +15 puana iki gecikme koydum. Ve her tikte , onları yeni bir fiyata yeniden düzenlerim. Fiyat keskin bir fiyat hareketiyle (çoğunlukla haberlerle) onlara dokunur dokunmaz, terminal donar. (Hepsi test cihazında, demoyu ve gerçek hayatı ziyaret etmedim) Neden donuyor?
 
MIR_KAZAN :
Açık. ve bu soru: Buystop ve selstop fiyatlarından +15 puana iki gecikme koydum. Ve her tikte, onları yeni bir fiyata yeniden düzenlerim. Keskin bir fiyat hareketi sırasında (çoğunlukla haberlerle) fiyat onlara dokunur dokunmaz terminal donar. (Hepsi test cihazında, demoyu ve gerçek hayatı ziyaret etmedim) Neden donuyor?

Dondurmanın nedenleri hakkında bir şey söyleyemem, psişik değilim, uzmanın koduyla uğraşın. Emrin gerçekleşmesinden sonra Expert Advisor'ın yeni bir fiyatla yeniden düzenlemeye çalıştığını varsayabilirim ancak bekleyen emir zaten piyasada olduğu için Expert Advisor'ınız takılıp kalıyor. İşin mantığını analiz etmek için temel EA değişkenlerinin durumunu günlüğe kaydetmeye çalışın.

 
Vitalii Ananev :

Dondurmanın nedenleri hakkında bir şey söyleyemem, psişik değilim, uzmanın koduyla uğraşın. Emrin gerçekleşmesinden sonra Expert Advisor'ın yeni bir fiyatla yeniden düzenlemeye çalıştığını varsayabilirim ancak bekleyen emir zaten piyasada olduğu için Expert Advisor'ınız takılıp kalıyor. İşin mantığını analiz etmek için temel EA değişkenlerinin durumunu günlüğe kaydetmeye çalışın.

Görünüşe göre tüm kontrol koşulları doğru ayarlanmış:

input int    Magic = 12;          // Магический номер ордеров
input int    Proskalzivanie = 5;  // Проскальзывание
input int    period = 200;        // Количество свечей для анализа волятильности
input int    tral = 20;           // Дистанция траллинга в пунктах
input int    tral_step = 3;       // Шаг срабатывания траллинга
input bool   use_step = true;     // Использовать шаг
input double Lot = 0.01;          // Лот
input double otstups = 0.0006;    // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
 int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
 for (int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
     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("Ошибка модификации ордера: ",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("Ошибка модификации ордера: ",GetLastError());
         }
       }
      }
    }
  }
}

void OnTick()
  {
//---
  double lot=Lot_Normalize(Symbol(),Lot,1);
  double sl= Dist_Normalize(Symbol(),tral);
  double step=Dist_Normalize(Symbol(),tral_step);
  double otstup=NormalizeDouble(otstups,Digits);
  int ord[8];
  Uchet_Orderov_Function(Symbol(),Magic,ord);
  if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
   {
    Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
    if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
    OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
    Print("Ошибка установки ордеров",GetLastError());
   }
  if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
   {
    if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
    OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
    Print("Ошибка установки ордеров",GetLastError());
   }
  if (ord[6]==1)
  {
   Trailing_Stop(Symbol(),Magic,sl,step,use_step);
   for(int i=OrdersTotal()-1; i>0; i++)
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
    if (!OrderDelete(OrderTicket(),clrNONE))
      Print("Ошибка удаления ордера!: ", GetLastError());
  }
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
 double summ=0;
 for (int i=1; i<=_period; i++)
  {
   summ+=MathAbs(High[i]-Low[i]);
  }
 return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
 double minlot = MarketInfo(_Symvol,MODE_MINLOT);
 double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
 double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
 double lot=_lot*_mult;
 if (lot<=minlot)lot=minlot;
 else if(lot>=maxlot) lot=maxlot;
 else if (lot>minlot && lot<maxlot)
 {
  int k=int((lot-minlot)/steplot);
  lot=NormalizeDouble(minlot+k*steplot,2);
 }
 return(lot);
}

double Dist_Normalize(string _Simvol, int _Distancia)
{
 int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
 double Pip=MarketInfo(_Simvol,MODE_POINT);
 if(Dig==3 || Dig==5)
  return NormalizeDouble(_Distancia*5*Pip,Dig);
 else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
 ArrayInitialize(_Mas,0);
 int Ticket=-1;
 for (int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
    OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
    {
     Ticket=OrderTicket();
     switch(OrderType())
     {
      case 0:{_Mas[0]++;_Mas[6]++;break;}
      case 1:{_Mas[1]++;_Mas[6]++;break;}
      case 2:{_Mas[2]++;_Mas[7]++;break;}
      case 3:{_Mas[3]++;_Mas[7]++;break;}
      case 4:{_Mas[4]++;_Mas[7]++;break;}
      case 5:{_Mas[5]++;_Mas[7]++;break;}
     }
    }
  }
}

void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
 for(int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
  {
   if(OrderType()>1)
   {
    if (!OrderDelete(OrderTicket(),clrNONE))
     Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
   }
  else
   {
    if (OrderType()==OP_BUY)
    {
     if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
       Alert("Ошибка закрытия ордера! ",GetLastError());
    }
    else
    {
     if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
       Alert("Ошибка закрытия ордера! ",GetLastError());
    }
   }
  }
}

}

 
khorosh :
Alış limitinin sadece fiyatın altında, satış limitinin ise fiyatın üzerinde ayarlanabileceğini dikkate almıyorsunuz. Teklif ettiğiniz şey için durdurma emirlerini kullanmanız gerekir.

Kabul, Kafa karıştırıcı algoritmamı anladığınız için teşekkürler. Erteleyenlerin isimlerini hala karıştırıyorum ...

Duraklar olsun, belki bir Uzman Danışman oluşturmaya çalışırız?

Daha sonra test edip ne olduğunu göstereceğim?

...ya da Amerika'yı keşfetmediğim için birinin linkini verir misiniz?

 
MIR_KAZAN :

Görünüşe göre tüm kontrol koşulları doğru ayarlanmış:

input int    Magic = 12;          // Магический номер ордеров
input int    Proskalzivanie = 5;  // Проскальзывание
input int    period = 200;        // Количество свечей для анализа волятильности
input int    tral = 20;           // Дистанция траллинга в пунктах
input int    tral_step = 3;       // Шаг срабатывания траллинга
input bool   use_step = true;     // Использовать шаг
input double Lot = 0.01;          // Лот
input double otstups = 0.0006;    // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
 int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
 for (int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
     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("Ошибка модификации ордера: ",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("Ошибка модификации ордера: ",GetLastError());
         }
       }
      }
    }
  }
}

void OnTick()
  {
//---
  double lot=Lot_Normalize(Symbol(),Lot,1);
  double sl= Dist_Normalize(Symbol(),tral);
  double step=Dist_Normalize(Symbol(),tral_step);
  double otstup=NormalizeDouble(otstups,Digits);
  int ord[8];
  Uchet_Orderov_Function(Symbol(),Magic,ord);
  if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
   {
    Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
    if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
    OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
    Print("Ошибка установки ордеров",GetLastError());
   }
  if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
   {
    if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
    OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
    Print("Ошибка установки ордеров",GetLastError());
   }
  if (ord[6]==1)
  {
   Trailing_Stop(Symbol(),Magic,sl,step,use_step);
   for(int i=OrdersTotal()-1; i>0; i++)
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
    if (!OrderDelete(OrderTicket(),clrNONE))
      Print("Ошибка удаления ордера!: ", GetLastError());
  }
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
 double summ=0;
 for (int i=1; i<=_period; i++)
  {
   summ+=MathAbs(High[i]-Low[i]);
  }
 return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
 double minlot = MarketInfo(_Symvol,MODE_MINLOT);
 double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
 double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
 double lot=_lot*_mult;
 if (lot<=minlot)lot=minlot;
 else if(lot>=maxlot) lot=maxlot;
 else if (lot>minlot && lot<maxlot)
 {
  int k=int((lot-minlot)/steplot);
  lot=NormalizeDouble(minlot+k*steplot,2);
 }
 return(lot);
}

double Dist_Normalize(string _Simvol, int _Distancia)
{
 int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
 double Pip=MarketInfo(_Simvol,MODE_POINT);
 if(Dig==3 || Dig==5)
  return NormalizeDouble(_Distancia*5*Pip,Dig);
 else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
 ArrayInitialize(_Mas,0);
 int Ticket=-1;
 for (int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
    OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
    {
     Ticket=OrderTicket();
     switch(OrderType())
     {
      case 0:{_Mas[0]++;_Mas[6]++;break;}
      case 1:{_Mas[1]++;_Mas[6]++;break;}
      case 2:{_Mas[2]++;_Mas[7]++;break;}
      case 3:{_Mas[3]++;_Mas[7]++;break;}
      case 4:{_Mas[4]++;_Mas[7]++;break;}
      case 5:{_Mas[5]++;_Mas[7]++;break;}
     }
    }
  }
}

void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
 for(int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
  {
   if(OrderType()>1)
   {
    if (!OrderDelete(OrderTicket(),clrNONE))
     Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
   }
  else
   {
    if (OrderType()==OP_BUY)
    {
     if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
       Alert("Ошибка закрытия ордера! ",GetLastError());
    }
    else
    {
     if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
       Alert("Ошибка закрытия ордера! ",GetLastError());
    }
   }
  }
}

}

Korkarım size yardımcı olamam çünkü kodunuz ayrıştırılamaz. Belki anlaşılmasını geliştirmek için ona yorumlar ekleyebilirsiniz. ord[] dizisinin ne için kullanıldığı ve hangi verileri depoladığı belli değil. Kodunuzu şöyle anladım: Her tikte sipariş tipini diziye yazarsınız (Uchet_Orderov_Function(Symbol(),Magic,ord);) sonra koşul kontrol edilir if(ord[7]==2 && ord[6] ==0 && Hacim[ 0]==1) ve doğruysa, bekleyen siparişler silinir ve tüm anlaşmalar kapatılır. Daha sonra if (ord[6]==0 && ord[7]==0 && Volume[0]==1) koşulu kontrol edilir ve doğru ise bekleyen iki emir açılır. Ancak aynı zamanda, if koşulunu kontrol etmeden önce ord[] dizisinin değeri (ord[6]==0 && ord[7]==0 && Volume[0]==1) güncellenmez. Ve sadece ikinci tıklamada güncellenecektir.

Genel olarak, ord[] dizisinin çalışma mantığını etkileyen tüm değerlerinin durumunu günlüğe kaydedin.

Ayrıca, bu kod parçasına bir göz atın:

 if (ord[ 6 ]== 1 )
  {
   Trailing_Stop( Symbol (),Magic,sl,step,use_step);
   for ( int i= OrdersTotal ()- 1 ; i> 0 ; i++)
     if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()== Symbol () && OrderType()> 1 )
     if (!OrderDelete(OrderTicket(), clrNONE ))
       Print ( "Ошибка удаления ордера!: " , GetLastError ());
  } 

Bence yeterli program parantezleri yok { . Teoride şöyle olmalı:

 if (ord[ 6 ]== 1 )
  {
   Trailing_Stop( Symbol (),Magic,sl,step,use_step);
   for ( int i= OrdersTotal ()- 1 ; i> 0 ; i++)
   {
     if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()== Symbol () && OrderType()> 1 )
       if (!OrderDelete(OrderTicket(), clrNONE ))
           Print ( "Ошибка удаления ордера!: " , GetLastError ());
   }
  } 
 
Vitalii Ananev :


Ayrıca, bu kod parçasına bir göz atın:

Bence yeterli program parantezleri yok { . Teoride şöyle olmalı:

Bu durumda parantezler işi (mantık) etkilemez. hata yok

 
Victor Nikolaev :

Bu durumda parantezler işi (mantık) etkilemez. hata yok

Belki değil, ama okuması daha kolay.
 
akarustam :

Kabul, Kafa karıştırıcı algoritmamı anladığınız için teşekkürler. Erteleyenlerin isimlerini hala karıştırıyorum ...

Duraklar olsun, belki bir Uzman Danışman oluşturmaya çalışırız?

Daha sonra test edip ne olduğunu göstereceğim?

...ya da Amerika'yı keşfetmediğim için birinin linkini verir misiniz?

Bir şey sunmak için en azından temel bilgiye sahip olmanız gerekir. Tüm basit fikirler uzun süredir test edildi ve aslında Amerika'yı keşfetmediniz. Ancak forumlarda ve kod tabanında neredeyse hiç kimse sizin için bir bağlantı aramayacaktır. İhtiyacın var - arıyorsun. Yoksa her türlü Uzman Danışmanlara, komut dosyalarına ve göstergelere giden bağlantıları aklında tutan insanlar olduğunu mu düşünüyorsunuz?
 
khorosh :
Bir şey sunmak için en azından temel bilgiye sahip olmanız gerekir. Tüm basit fikirler uzun süredir test edildi ve aslında Amerika'yı keşfetmediniz. Ancak forumlarda ve kod tabanında neredeyse hiç kimse sizin için bir bağlantı aramayacaktır. İhtiyacın var - arıyorsun. Yoksa her türlü Uzman Danışmanlara, komut dosyalarına ve göstergelere giden bağlantıları aklında tutan insanlar olduğunu mu düşünüyorsunuz?
... düşünce.
 

Bir fikrim var, yardıma ihtiyacım var)) Bunun altına bir danışman yazın

Aslında Masha ama standart olmayan ayarlarla) Uzun zamandır ticaret yapıyorum. Bir çift için ayda 1000 puandan çıkıyor. Her şeyi izlemek imkansız olduğu için uzmanlara dönmeye karar verdim. Pratikte düşüş yok, maksimum 5 puan) Burada, 1 çift için sadece 1 işlem olduğundan, hacimlerle oynayabilir ve birkaç çift üzerine bahis yapabilirsiniz.

  Zaman Çerçevesi H4

1.MA4/basit\kapat

2.MA5/basit\açık

Çalışma prensibi şu şekilde olmalıdır..
Kâr almak veya zararı durdurmak yok. Anlaşmaları yalnızca kavşaklarda açın ve kapatın. Örneğin aşağıdan yukarıya geçti, yukarıya bir emir açtı, sadece geriye geçtiğinde emri kapattı. Bir ters sinyal alındığında, anlaşmayı kapatmak için satın alma bir köy açtı. Genel olarak, umarım anlamışsınızdır) stratejide önemli olan kâr bile değil, bu lanet olası kesişmeler) Bunun gibi bir şey) Bu stratejiyi uzun süredir ticaret yapıyorum, kâr iyidir, ancak göründüğü için bana bu strateji için bir danışman yazmak zor olmayacak.

Yardım etmeyi kabul ederseniz, işte POSTA'm: 4iterRrock@mail.ru

Aşağıda neredeyse bir yıldır ticaret yaptığım şablonum var.

Dosyalar:
MAxi2r.tpl  2 kb