Ich schreibe kostenlos einen Ratgeber - Seite 21

 
Vitalii Ananev:

Meinen Sie damit, dass Sie Transaktionen bei der Eröffnung einer D1-Kerze eröffnen? Wenn dies der Fall ist, geben Sie in der Logik des Expert Advisors die Bedingungen für die Eröffnung von Transaktionen nur zu einem bestimmten Zeitpunkt an.

Verstehe, und noch eine Frage: Ich habe zwei schwebende Orders bei +15 Pips vom Kurs gesetzt, und einen SellStop und einen ByStop. Und bei jedem Ticken verschiebe ich sie auf einen neuen Preis. Sobald der Kurs bei starken Kursbewegungen (meist bei Nachrichtenereignissen) diese berührt, bleibt das Terminal hängen. (Warum friert es ein?
 
MIR_KAZAN:
Verstehe, und noch eine Frage: Ich habe zwei Pending Orders bei +15 Pips vom Preis gesetzt: Buystop und Sellstop. Und bei jedem Ticken verschiebe ich sie auf einen neuen Preis. Sobald der Kurs bei starken Kursbewegungen (meist bei Nachrichtenereignissen) diese berührt, bleibt das Terminal hängen. (Warum friert es ein?

Ich kann nicht sagen, warum er sich aufhängt, ich bin kein Hellseher, beschäftigen Sie sich mit dem Code des Expert Advisors. Ich kann davon ausgehen, dass Ihr EA nach der Ausführung des Auftrags versucht, ihn zu einem neuen Preis zu verschieben, aber da der schwebende Auftrag bereits auf dem Markt ist, bleibt Ihr EA hängen. Versuchen Sie, im Protokoll den Zustand der Schlüsselvariablen des Expert Advisors anzuzeigen, um seine Betriebslogik zu analysieren.

 
Vitalii Ananev:

Ich kann nicht sagen, warum er sich aufhängt, ich bin kein Hellseher, beschäftigen Sie sich mit dem Code des Expert Advisors. Ich kann davon ausgehen, dass Ihr EA nach der Ausführung des Auftrags versucht, ihn zu einem neuen Preis zu verschieben, aber da der schwebende Auftrag bereits auf dem Markt ist, bleibt Ihr EA hängen. Versuchen Sie, im Protokoll den Zustand der Schlüsselvariablen des EA anzuzeigen, um die Logik seiner Arbeit zu analysieren.

Ich denke, ich habe alle Bedingungen richtig eingestellt:

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:
Sie berücksichtigen nicht, dass das Kauflimit nur unterhalb des Preises und das Verkaufslimit nur oberhalb des Preises festgelegt werden kann. Für das, was Sie vorschlagen, müssen Sie Stop-Aufträge verwenden.

Einverstanden, danke für das Verständnis meines verwirrenden Algorithmus. Ich bin immer noch verwirrt über die Namen der Anhänger...

Sollen sie doch aufhören, vielleicht sollten wir versuchen, einen EA zu bauen?

Ich werde es später testen und zeigen, was passiert ?

... Oder geben Sie mir einen Link zu einem, es ist ja nicht so, dass ich Amerika entdeckt hätte?

 
MIR_KAZAN:

Ich glaube, ich habe alle Testbedingungen richtig eingestellt:

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());
    }
   }
  }
}

}

Ich fürchte, ich kann Ihnen nicht helfen, denn Ihr Code eignet sich nicht für eine Analyse. Vielleicht können Sie einige Kommentare hinzufügen, um Ihr Verständnis zu verbessern. Es ist nicht klar, wofür das ord[]-Array verwendet wird und welche Daten es speichert. Ich habe Ihren Code so verstanden: Sie schreiben bei jedem Tick den Ordertyp in das Array (Uchet_Orderov_Function(Symbol(),Magic,ord);) dann prüfen Sie die Bedingung if(ord[7]==2 && ord[6]==0 && Volume[0]==1) und wenn sie wahr ist, werden die ausstehenden Aufträge gelöscht und alle Positionen geschlossen. Dann prüfen wir die Bedingung, ob (ord[6]==0 && ord[7]==0 && Volume[0]==1) und wenn sie wahr ist, werden zwei schwebende Aufträge eröffnet. Der Wert des ord[]-Arrays wird jedoch nicht aktualisiert, bevor die Bedingung geprüft wurde, wenn (ord[6]==0 && ord[7]==0 && Band[0]==1). Und sie wird erst beim zweiten Ticken aktualisiert.

Sie müssen also alle Werte des ord[]-Arrays protokollieren, die seine Logik beeinflussen.

Beachten Sie auch dieses Codefragment:

 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());
  } 

Ich glaube, es fehlen Software-Klammern { . Das sollte so sein:

 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:


Beachten Sie auch diesen Teil des Codes:

Ich glaube, es fehlen die Klammern { . Es sollte so sein:

In diesem Fall haben die Klammern keinen Einfluss auf die Operation (Logik). Es liegt kein Fehler vor

 
Victor Nikolaev:

In diesem Fall haben die Klammern keinen Einfluss auf die Operation (Logik). Es liegt kein Fehler vor.

Vielleicht nicht, aber es ist leichter zu lesen.
 
akarustam:

Einverstanden, danke für das Verständnis meines verwirrenden Algorithmus. Ich bin immer noch verwirrt über die Namen der Anhänger...

Sollen sie doch aufhören, vielleicht sollten wir versuchen, einen EA zu bauen?

Ich werde es später testen und zeigen, was passiert ?

... Oder geben Sie mir einen Link zu einem, es ist ja nicht so, dass ich Amerika entdeckt hätte?

Um etwas vorzuschlagen, sollten Sie zumindest über Grundkenntnisse verfügen. Alle einfachen Ideen sind längst erprobt, und Sie haben Amerika wirklich nicht entdeckt. Aber suchen Sie für Sie durch Foren und kodobase unwahrscheinlich, wer wird zu verlinken. Wenn Sie es brauchen, suchen Sie es. Oder glauben Sie, es gibt Leute, die Links zu allen möglichen Expert Advisors, Skripten und Indikatoren im Kopf haben?
 
khorosh:
Man muss zumindest über Grundkenntnisse verfügen, um etwas vorschlagen zu können. Alle einfachen Ideen sind schon lange ausprobiert worden, und in der Tat haben Sie Amerika nicht entdeckt. Aber es ist unwahrscheinlich, dass jemand in Foren und auf kodobase nach einem Link für Sie sucht. Wenn Sie es brauchen, suchen Sie es. Oder glauben Sie, es gibt Leute, die Links zu allen möglichen Expert Advisors, Skripten und Indikatoren im Kopf haben?
...angenommen.
 

(Ich habe eine Idee, ich brauche Hilfe)) Schreiben Sie einen Expert Advisor für diese

Ich benutze es schon seit langem für den Handel. Ich erhalte monatlich 1000 Pips auf ein Währungspaar. Ichhabe mich noch nie mit dieser Art von Handel beschäftigt. Es gibt praktisch keinen Drawdown, maximal 5 Pips.

Zeitrahmen H4

1. MA4/simple\close

2. MA5/einfach/offen

Das Arbeitsprinzip sollte folgendermaßen aussehen
Ohne Take Profit und Stop Loss. Eröffnen und schließen Sie Trades nur bei Crossovers. Zum Beispiel wird ein Auftrag durch Kreuzen von unten nach oben nach oben geöffnet und erst beim Zurückkreuzen geschlossen. Wenn es ein umgekehrtes Signal zum Schließen des Kaufauftrags gibt, wird der Verkaufsauftrag geöffnet. Im Allgemeinen hoffe ich, dass Sie verstehen) in der Strategie ist es nicht einmal der Gewinn, der zählt, aber diese verdammten Kreuzungen) So etwas wie dieses) Handel auf dieser Strategie für eine lange Zeit, der Gewinn ist gut, aber da ich denke, diese Strategie zu schreiben Expert Advisor wird nicht schwierig sein.

Wenn Sie bereit sind zu helfen, hier ist meine MAIL: 4iterRrock@mail.ru

Nachfolgend sehen Sie mein Muster, das ich seit fast einem Jahr handele.

Dateien:
MAxi2r.tpl  2 kb
Grund der Beschwerde: