Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1800

 

Was ist der DecreaseFactor im Standard-MT-Advisor auf Mashcats?

lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
 
Nerd Trader #:

Es ist seltsam, die Tasten sind jetzt da. Und das Code-Wirrwarr, weil es ein Entwurf ist. Wie auch immer, ich habe bereits eine funktionierende Version erstellt, das letzte, was noch fehlt, ist das Löschen der Buttons, und hier fing der Mist wieder an: die Löschfunktion findet keines der 4 Objekte.

Wenn Sie auf die Schaltfläche klicken, werden alle Zeilen erstellt:

Wenn die Taste gedrückt wird - löschen:

Es tut mir leid, sagen zu müssen, was für ein Unsinn geschrieben wird.

 
Artyom Trishkin #:

Und Sie müssen sich die Ereignisse nicht ansehen. Im Testgerät funktionieren sie überhaupt nicht. Sie müssen den Status beobachten.

UPD. Natürlich nicht bescheiden, aber wenn du einmal auf meine Tipps gehört hättest, hättest du schon längst alles erledigt. Richtig und ohne die Krücken eines Mehrgeschossers.

Aber jeder wählt den Abgrund, in den er sich stürzen will.

Mihail Matkovskij #:

Um das Debugging im Tester zu nutzen, müssen Sie lernen, in MQL5 zu schreiben. Dort funktioniert alles.

Es findet keine Umbenennung von Objekten statt. Man kann sich das so vorstellen, dass ein bestehendes Objekt durch ein neues ersetzt wird.

Das kann nicht sein. Ihr Code sieht nach einem Durcheinander aus. Das ist wahrscheinlich der Grund für die Verzögerungen bei den Tasten. Wie ich Ihnen bereits gesagt habe, beginnen Sie mit etwas Einfachem. Machen Sie die Dinge nicht zu kompliziert. Und wenn das Einfache zu funktionieren beginnt und Sie davon überzeugt sind, können Sie es nach und nach komplizierter machen.

Und wie sehe ich Zustände, wenn sie durch ein Ereignis ausgelöst werden (durch Klicken)? Ja, aber ich schreibe in mql4, es ist das gleiche wie zu sagen "lernen, in c# zu schreiben, wo Debug funktioniert".

"Korrekt und ohne mehrstöckige Krücken. "Das Verstecken von Gegenständen ist also nur eine Krücke.

Alles, was ich gemacht habe, funktioniert https://gist.github.com/satorkain/0cf7a8df8ec1f4b3191defd04c94a418
Wenn man auf die Schaltfläche klickt, werden alle Zeilen auf einmal erstellt, dann werden sie ausgeblendet und nur eine bleibt übrig, je nach Position der Schaltfläche. Je nachdem, wo sich der Cursor im Verhältnis zum Preis befindet, werden weitere Zeilen ein- oder ausgeblendet.

P.S.

Wäre mql4 nicht so krumm, hätte ich mir diesen Unsinn mit dem Verstecken von Objekten nicht einfallen lassen müssen, denn mit dem Löschen/Umbenennen von Objekten hätte alles auf Anhieb funktionieren müssen.

stop order button (public).mq4
stop order button (public).mq4
  • gist.github.com
GitHub Gist: instantly share code, notes, and snippets.
 
Nerd Trader #:

Und wie sehe ich Zustände, wenn sie durch ein Ereignis ausgelöst werden (durch Klicken)? Ja, aber ich schreibe in mql4, es ist das gleiche wie zu sagen "lernen, in c# zu schreiben, wo Debug funktioniert".

"Korrekt und ohne mehrstöckige Krücken. "Das Verstecken von Gegenständen ist also nur eine Krücke.

Alles, was ich gemacht habe, funktioniert https://gist.github.com/satorkain/0cf7a8df8ec1f4b3191defd04c94a418
Wenn man auf die Schaltfläche klickt, werden alle Zeilen auf einmal erstellt, dann werden sie ausgeblendet und nur eine bleibt übrig, je nach Position der Schaltfläche. Je nachdem, wo sich der Cursor im Verhältnis zum Preis befindet, werden weitere Zeilen ein- oder ausgeblendet.

P.S.

Wenn es das krumme mql4 nicht gäbe, hätte ich mir diesen Unsinn mit dem Verstecken von Objekten nicht einfallen lassen müssen, auch beim Löschen/Umbenennen von Objekten hätte alles auf Anhieb funktionieren müssen.

DasAusblenden eines Objekts ist nur die vom Entwickler empfohlene Methode. Und es gibt eine besondere Eigenschaft dafür. Um den Status zu sehen, müssen Sie sich die Eigenschaft "Status" der Schaltfläche ansehen.

Was hier schief ist, ist Ihre Logik und die Ersetzung von Begriffen - Sie nehmen die von den Entwicklern empfohlenen Mittel als Krücke, und Sie nehmen die ständige unersättliche Erstellung/Löschung von Objekten als reinen Code, aber das ist genau das, was eine Krücke ist, die Umgehung der empfohlenen schnellen Methode.

Übrigens, um ein Objekt schnell an die Spitze aller anderen zu setzen, müssen Sie es unsichtbar und sofort wieder sichtbar machen - dadurch wird seine Position in der Objektliste neu definiert, und es wird an der Spitze stehen.

ZS. Und selbst dort, auf dem Git, haben Sie den Code mit einem C-minus veröffentlicht. Völlig fehleranfällig. Nur eine Zeile wird nicht erstellt und alles bricht zusammen. Das war sofort klar. Sie erstellen Zeilen im Eventhandler - wozu? Wozu brauchen Sie OnInit()? Sie haben sie erstellt, ihren Erfolg überprüft, ein Kennzeichen gesetzt und sie versteckt. In OnDeinit() haben Sie von Ihrem Programm erstellte Objekte gelöscht. Dazu benötigen Sie auch das Namenspräfix.

Sie zeigen und verbergen nur im Event-Handler - es sollte kein Gebäude geben. Für Ihren Fall - genau.

Ich würde mich schämen, so etwas in der Öffentlichkeit auf Git zu veröffentlichen. Aber das ist für mich.

Was ist mit Ihnen? Ist es in Ordnung, dass die Menschen dies ausnutzen?

 
Artyom Trishkin #:

DasAusblenden eines Objekts ist genau die vom Entwickler empfohlene Methode. Und es gibt eine besondere Eigenschaft dafür. Um den Status zu sehen, müssen Sie sich die Eigenschaft "Status" der Schaltfläche ansehen.

Was hier schief ist, ist Ihre Logik und die Ersetzung von Begriffen - Sie nehmen die von den Entwicklern empfohlenen Mittel als Krücke, und Sie nehmen die ständige unersättliche Erstellung/Löschung von Objekten als reinen Code, aber genau das ist eine Krücke, um die empfohlene schnelle Methode zu umgehen.

Übrigens, um ein Objekt schnell an die Spitze aller anderen zu setzen, müssen Sie es unsichtbar und sofort wieder sichtbar machen - dadurch wird seine Position in der Objektliste neu definiert, und es wird an der Spitze stehen.

ZS. Und selbst dort, auf dem Git, haben Sie den Code mit einem C-minus veröffentlicht. Völlig fehleranfällig. Sobald eine Zeile nicht erstellt wird, bricht die ganze Sache zusammen. Das war sofort klar. Sie erstellen Zeilen im Eventhandler - wozu? Wozu brauchen Sie OnInit()? Sie haben sie erstellt, ihren Erfolg überprüft, ein Kennzeichen gesetzt und sie versteckt. In OnDeinit() haben Sie von Ihrem Programm erstellte Objekte gelöscht. Dazu benötigen Sie auch das Namenspräfix.

Sie zeigen und verbergen nur im Event-Handler - es sollte kein Gebäude geben. Für Ihren Fall - genau.

Ich würde mich schämen, so etwas in der Öffentlichkeit auf Git zu veröffentlichen. Aber das ist für mich.

Was ist mit Ihnen? Ist es in Ordnung, dass die Menschen dies ausnutzen?

Begierig darauf, 1 Zeile von 4 nach Bedarf zu erstellen? :) Was ist, wenn es 200 Zeilen sind? Wäre es nach Ihrer Logik wirtschaftlich, sie alle auf einmal zu schaffen? Und wie sie von den Entwicklern konzipiert wurde, wissen nur sie selbst, und zwar auf eine sehr unintuitive Weise. Als ob nichts Unglaubliches oder Unlogisches erforderlich wäre. Woher hätte ich wissen sollen, dass ich nur auf diese Weise mit Objekten arbeiten sollte und nicht auf eine andere Art? Vielleicht aus einem Lehrbuch über mql4? Ich bezweifle, dass dieser Punkt dort erklärt wird.

Zumindest funktioniert es so, wie es gedacht war :) Es steht in Klammern im Titel (öffentlich), also ist es noch nicht vollständig, aber ja, es gibt keine Prüfung zum Erstellen von Objekten, das sollten wir beheben. Und ich habe es nur auf Git gepostet, weil ich mich nicht an paste bin erinnern konnte. Beschämt? Git wurde geschaffen, um zu lernen, Erfahrungen auszutauschen, Code zu teilen, ob er funktioniert oder nicht, macht keinen Unterschied, jeder kann einen Fork machen und Änderungen vornehmen, wenn er mit etwas nicht zufrieden ist.

So, 250 Objekte wurden erstellt und für die Dauer des Expert Advisors im Speicher abgelegt. Gut, danke, dann weiß ich Bescheid. Das ist es, was ich mit "nicht intuitiver Logik" meine. Im Tutorial über OnInit() können Sie zum Beispiel nur lesen, dass die Funktion während der Initialisierung des Expert Advisors/Indikators ausgeführt wird.

 
Nerd Trader #:


Ich will Ihnen ein Geheimnis verraten. Sie können bis zu 1.000 Objekte oder mehr erstellen, solange Sie keinen "Taschenrechner" haben. Aber sie kann es auch. Ein Taschenrechner ist ein Computer mit 4 GB RAM. Alles, was darunter liegt, ist "Großmutters Taschenrechner"... :) Sie können also alle Objekte auf einmal oder eines nach dem anderen erstellen. Es macht keinen Unterschied. Aber ohne Fanatismus.

Auf diese Weise funktioniert alles für alle, wenn man es klug anstellt!...

 
Nerd Trader #:

Voraciousness, um 1 Zeile von 4 nach Bedarf zu erstellen? :) Was ist, wenn es 200 Zeilen sind? Wäre es nach Ihrer Logik wirtschaftlich, sie alle auf einmal zu erstellen? Und wie sie von den Entwicklern konzipiert wurde, wissen nur sie selbst, und zwar auf eine sehr unintuitive Weise. Als ob nichts Unglaubliches oder Unlogisches erforderlich wäre. Woher hätte ich wissen sollen, dass ich nur auf diese Weise mit Objekten arbeiten sollte und nicht auf eine andere Art? Vielleicht aus einem Lehrbuch über mql4? Ich bezweifle, dass dieser Punkt dort erklärt wird.

Zumindest funktioniert es so, wie es gedacht war :) Es steht in Klammern im Titel (öffentlich), also ist es noch nicht vollständig, aber ja, es gibt keine Prüfung zum Erstellen von Objekten, das sollten wir beheben. Und ich habe es nur auf Git gepostet, weil ich mich nicht an paste bin erinnern konnte. Beschämt? Git wurde geschaffen, um zu lernen, Erfahrungen auszutauschen, Code zu teilen, ob er funktioniert oder nicht, macht keinen Unterschied, jeder kann einen Fork machen und Änderungen vornehmen, wenn er mit etwas nicht zufrieden ist.

So, 250 Objekte wurden erstellt und für die Dauer des Expert Advisors im Speicher abgelegt. Gut, danke, dann weiß ich Bescheid. Das ist es, was ich mit "nicht intuitiver Logik" meine. Sie können im Tutorial z.B. über OnInit() lesen, dass die Funktion während der Initialisierung eines EA/Indikators abgearbeitet wird.

Sie können so viele Objekte gleichzeitig erstellen, wie Sie benötigen. Damals war MT in Bezug auf das Zeichnen von Indikatorpuffern noch nicht sehr weit entwickelt. Wir mussten 400 sichtbare Candlesticks mit Trendlinien zeichnen, für eine Kerze brauchten wir 5 Linien, 400*5=2000, plus ein Objekt für jede Kerze und so weiter. Insgesamt haben wir etwa 2500 Objekte. Es funktionierte ohne jegliche Stumpfheit.

Sie verstehen die Logik der Arbeit mit Objekten nicht ganz, aber Sie wissen, wie man argumentiert. Es ist besser, das Gegenteil zu tun.

 
Nerd Trader #:

Voraciousness, um 1 Zeile von 4 nach Bedarf zu erstellen? :) Was ist, wenn es 200 Zeilen sind? Wäre es nach Ihrer Logik wirtschaftlich, sie alle auf einmal zu erstellen? Und wie sie von den Entwicklern konzipiert wurde, wissen nur sie selbst, und zwar auf eine sehr unintuitive Weise. Als ob nichts Unglaubliches oder Unlogisches erforderlich wäre. Woher hätte ich wissen sollen, dass ich nur auf diese Weise mit Objekten arbeiten sollte und nicht auf eine andere Art? Vielleicht aus einem Lehrbuch über mql4? Ich bezweifle, dass dieser Punkt dort erklärt wird.

Zumindest funktioniert es so, wie es gedacht war :) Es steht in Klammern im Titel (öffentlich), also ist es noch nicht vollständig, aber ja, es gibt keine Prüfung, um Objekte zu erstellen, das sollten wir beheben. Und ich habe es nur auf Git gepostet, weil ich mich nicht an paste bin erinnern konnte. Beschämt? Git wurde geschaffen, um zu lernen, Erfahrungen auszutauschen, Code zu teilen, ob er funktioniert oder nicht, macht keinen Unterschied, jeder kann einen Fork machen und Änderungen vornehmen, wenn er mit etwas nicht zufrieden ist.

So, 250 Objekte wurden erstellt und für die Dauer des Expert Advisors im Speicher abgelegt. Gut, danke, dann weiß ich Bescheid. Das ist es, was ich mit "nicht intuitiver Logik" meine. Im Tutorial über OnInit() können Sie zum Beispiel nur lesen, dass die Funktion während der Initialisierung des Expert Advisors/Indikators verarbeitet wird.

Herzlich willkommen. Ich werde versuchen, es in einfachem Russisch zu erklären.

Sie gehen auf einen Angelausflug.

  1. Zu Hause öffnen Sie die Speisekammer, kratzen sich am Kopf und schließen sie wieder.
  2. Sie gehen angeln und brauchen eine Angel.
  3. Du gehst nach Hause in den Abstellraum, um eine Angelrute zu holen.
  4. Du warst angeln, hast deine Angel ausgeworfen und einen Fisch gefangen, und dann hast du ein Netz gebraucht
  5. Ging nach Hause in den Lagerraum für das Netz
  6. Sie waren angeln, haben den gefangenen Fisch mit dem Netz an den Haken genommen und brauchten einen Behälter, um den gefangenen Fisch aufzubewahren.
  7. Nach Hause gehen für ..... Soll ich fortfahren?

Oder Sie nehmen gleich alles, was Sie brauchen, aus der Speisekammer (OnInit), fischen, ohne herumzulaufen, und räumen, wenn Sie nach Hause kommen, alles in die Speisekammer und den Kühlschrank (OnDeinit).

Vielleicht haben Sie hier im Forum davon erfahren. Man muss nur manchmal zuhören und hören, was einem gesagt wird.

Andernfalls erhalten Sie eine Frage, eine Antwort, sagen "Blödsinn" und machen, was Sie denken.

Sie müssen zunächst über die Frage nachdenken, Fragen stellen und dann mit der Bearbeitung beginnen.

Ist Ihnen bewusst, dass das einfachste am Programmieren das Drucken von Code ist? Und der Löwenanteil der Entwicklung besteht darin, über die Logik nachzudenken.

 

Es tut mir leid, dass ich dies ein zweites Mal anspreche.

Aber es gibt ein Problem, das ich noch nicht lösen kann, nämlich

Eröffnung einer Reihe von Aufträgen (einer nach dem anderen) für dieselbe Kerze.

Ich muss verhindern, dass der EA eine neue Order für dieselbe Kerze öffnet.

Ich dachte daran, das Problem mit Sleep() zu lösen, aber Makar meinte, es wäre besser, den Prozess nicht anzuhalten.

Problem.

Der Code sieht nun wie folgt aus:

// Параметры советника
input string  sParametersEA = "";     // Параметры советника
input double  Lot           = 0.01;   // Количество лотов
input int     StopLoss      = 30;     // Уровень убытка
input int     TakeProfit    = 30;     // Уровень прибыли
input int     Slippage      = 3;      // Проскальзование (в пунктах)
input int     Magic         = 1;      // Индентификатор советника
input double  K_Martin1     = 2.0;    // Множитель мартин 1
input double  K_Martin2     = 2.0;    // Множитель мартин 2
input double  K_Martin3     = 2.0;    // Множитель мартин 3
input int     OrdersClose   = 5;      // Ограничение лотности мартин1
input int     OrdersClose2  = 5;      // Ограничение лотности мартин2
input int     DigitsLot     = 2;      // Точность лотности
// Параметры индикатора
input string  sParametersMA = "";     // Параметры индикатора
input int     PeriodMA      = 14;     // Период мувинга
input int     MovingShift   = 1;      // Сдвиг мувинга
// Глобальные переменные
string AC;
datetime Start;
double dMA;
double MaxMartinLot;
double MaxMartinLot2;
//+-----------------------------------------------------------------------------------------------+
int OnInit()
  {
Start          = TimeCurrent();
MaxMartinLot   = Lot*MathPow(1.4,OrdersClose);
MaxMartinLot2  = Lot*MathPow(K_Martin2,OrdersClose2);
AC             = StringConcatenate(" ", AccountCurrency());
return(INIT_SUCCEEDED);
  }
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt=0;
   int i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderMagicNumber()==Magic) cnt++;
           }
        }
     }
   return(cnt);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if(dMA > Open[1] && dMA < Close[1])  //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
  {
   if(dMA < Open[1] && dMA > Close[1])
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
// Тикет ордера
   int iOTi = 0;   

   iOTi = OrderSend(Symbol(), OP_BUY, LOT(), Ask, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
// Проверим открылся ли ордер
   if(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError(GetLastError());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на продажу |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenSell()
  {
// Тикет ордера  
   int iOTi = 0;   
//Print(bCheckOrders());
   iOTi = OrderSend(Symbol(), OP_SELL, LOT(), Bid, Slippage, 0, 0, "", Magic, 0, clrNONE);

// Проверим открылся ли ордер
   if(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError(GetLastError());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                    Функция модификации ордера |
//+-----------------------------------------------------------------------------------------------+
void vOrderModify(int iOTi)
  {
   int    iOTy = -1;    // Тип ордера
   double dOOP = 0;     // Цена открытия ордера
   double dOSL = 0;     // Стоп Лосс
   int    iMag = 0;     // Идентификатор советника
   double dSL  = 0;     // Уровень убытка
   double dTP  = 0;     // Уровень прибыли

// Выберем по тикету открытый ордер, получим некоторые значения
   if(OrderSelect(iOTi, SELECT_BY_TICKET, MODE_TRADES))
     {
      iOTy = OrderType();
      dOOP = OrderOpenPrice();
      dOSL = OrderStopLoss();
      iMag = OrderMagicNumber();
     }

// Если ордер открыл данный советник, то входим в условие
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == iMag)
     {
// Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордер
      if(dOSL == 0)
        {
         if(iOTy == OP_BUY)
           {
            dSL = NormalizeDouble(dOOP - StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP + TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }

         if(iOTy == OP_SELL)
           {
            dSL = NormalizeDouble(dOOP + StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP - TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }
        }
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                      Функция обработки ошибок |
//+-----------------------------------------------------------------------------------------------+
void vError(int iErr)
  {
   switch(iErr)
     {
      case 129:   // Неправильная цена
      case 135:   // Цена изменилась
      case 136:   // Нет цен
      case 138:   // Новые цены
         Sleep(1000);
         RefreshRates();
         break;

      case 137:   // Брокер занят
      case 146:   // Подсистема торговли занята
         Sleep(3000);
         RefreshRates();
         break;
     }
  }
//+-----------------------------------------------------------------------------------------------+
double LOT()
{
   int n=0;
   int m=0;
   int v=0;
   double OL=Lot;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderProfit()>0) 
            {

               if (n==0) OL=NormalizeDouble(OrderLots()+K_Martin1,DigitsLot);
               n++;
               
               if ((OL>=MaxMartinLot)&& (m==0)) OL=NormalizeDouble(OrderLots()*K_Martin2,DigitsLot);
               m++;
               
               if ((OL>=MaxMartinLot2) && (v==0)) OL=NormalizeDouble(OrderLots()*K_Martin3,DigitsLot);
               v++;
            }
            else
            {
               if (n==0) {return(Lot);}
               else {return(OL);}
            }
         }
      }
   }
   
   return(OL);
}
 
законопослушный гражданин #:

Ich möchte, dass der EA nicht in der Lage ist, eine neue Order für dieselbe Kerze zu öffnen.

void OnTick()
  {
  datetime cTime;
  static datetime time = 0;

  cTime = iTime(NULL, PERIOD_CURRENT, 0);

  if (time != cTime)
    time = cTime;
  else
    return;

// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
Grund der Beschwerde: