Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 214

 
Aleksandr Martynov:

UPS, ich glaube, ich habe es gefunden:

In der Dokumentation heißt es dazu:

Wenn ein benutzerdefinierter Indikator mit der FunktioniCustom()aufgerufen wird, läuft dieser Indikator im Thread des aufrufenden Programms. Die (importierten) Bibliotheksfunktionen arbeiten auch im Thread des aufrufenden Programms.

Im Allgemeinen spielt es bei MQL4 keine Rolle, wo Sie die Berechnungen platzieren, da die Ressourcen für den einzelnen Thread des Programms und die von ihm verwendeten Indikatoren zugewiesen werden.

In diesem Fall ist es ratsam, wenn möglich, den Code des Indikators in den Expert Advisor zu übertragen und die Anzahl der berechneten Werte durch die Tiefe des Arrays und die Anzahl der "Puffer" zu optimieren, auch wenn dies nicht die rekursiven Algorithmen betrifft - es ist immer noch einfacher, sie im Indikator zu lesen, da das Programm automatisch indizierte Puffer nur für die Preisdaten hat ...

Das Problem liegt in der Bequemlichkeit des Lesens und Bearbeitens des Codes, und deshalb ist mt4 in einem Fenster single-threaded. Für mich ist es einfacher, den Berechnungsteil eines Indikators in einen Expert Advisor zu übernehmen. Aber das ist nicht immer gut. Der Code stellt sich als lang heraus, während inludes oder iQuest derselbe ist. Wenn Sie zu beschleunigen, dann mt5. mt4 ist nicht schnell genug, die Beurteilung von Forumsteilnehmern.

 
Valeriy Yastremskiy:

Die Frage ist, wie einfach es ist, den Code zu lesen und zu bearbeiten, und wie es ist, mt4 ist single-threaded in einem Fenster. Ich finde es einfacher, den Berechnungsteil eines Indikators in einen EA zu integrieren. Aber das ist nicht immer gut. Der Code stellt sich als lang heraus, während inludes oder iQuest derselbe ist. Wenn Sie schneller werden wollen, gehen Sie zu mt5. mt4 ist langsamer, wenn man nach den Kommentaren im Forum urteilt.

Wenn Sie schneller sein wollen, dann ist es mt5, aber mt4 verliert, wenn man die Kommentare im Forum betrachtet. Also einfache Formeln wie Mittelwertbildung, Zickzack, und nicht irgendeine Art. 5 ist sicherlich gut, aber noch nicht jeder bietet es an und man muss es lernen

 
Aleksandr Martynov:

Die Verwaltung der Berechnungspuffer im EA wird teurer sein als der Indikator... So einfache Formeln wie Mittelwertbildung, Zickzack und nicht alle von ihnen. 5 ist natürlich gut, aber nicht jeder hat Zugang dazu.

Dazu müssen Sie jedoch den Code der Indikatorlogik entfernen, was nicht immer einfach ist.

 
Wie sicher ist es, die EA- und Terminalprotokolle auf Anfrage an einen Entwickler weiterzugeben? Kann er etwas mit meinem Konto oder Computer anstellen?

 
Alexander Kovalev:
Wie sicher ist es, dem Entwickler die EA- und Terminalprotokolle auf seine Anfrage hin zu übergeben? Kann er etwas mit meinem Konto oder Computer anstellen?

Ja, und nimm auch den ganzen Goldschmuck aus dem Haus aus der Schatulle

 

Meine Freunde, bitte beraten Sie mich, wo ich falsch gehe (bitte töten Sie mich nicht, ich habe in MQL4 für 3 Tage arbeiten).


Ich versuche, einen SELL-Auftrag vom Markt zu einem Preis zu eröffnen, der um Delta-Punkte (60) von dem zuvor platzierten Wert (den ich bei der Eröffnung eines vorherigen Auftrags nehme) eingerückt ist.

Das Skript eröffnet jedoch eine neue Order zur gleichen Zeit wie die vorherige, zum aktuellen Preis, ohne die entsprechende Bedingung abzuwarten (ein Kursrückgang um 60 Punkte). Ich weiß, dass ich es irgendwo geschafft habe, aber ich weiß immer noch nicht, wo das ist.

Ich wäre Ihnen sehr dankbar!


Eine seltsame Entdeckung

 

Helfen Sie mir!!!

Ich kann nicht herausfinden, wo mein Problem liegt. Der EA benötigt EMA-Volumen. Ich habe iMAonArray verwendet.

Aber die Berechnung entspricht nicht der Realität.

Hier ist der Code:

***

Dateien:
 
Aleksandr Martynov:
Gute Frage, ich habe ein Auto und es klappert etwas darin, welche Schraube muss ich anziehen? Haben Sie eine Ahnung, wie viele Ratschläge möglich sind und am Ende sind sie alle nutzlos, weil man die Mutter anziehen muss...
Es gibt nur einen Code im Studio und keine andere Möglichkeit.

Sehen Sie sich den Grund an, warum es sich nicht für Gold öffnet?

***

Документация по MQL5: Дата и время / TimeCurrent
Документация по MQL5: Дата и время / TimeCurrent
  • www.mql5.com
Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов. В обработчике OnTick() данная функция вернет время пришедшего обрабатываемого тика. В других случаях (например, вызов в обработчиках OnInit(), OnDeinit(), OnTimer() и так далее) это –...
 
Наджибулло Хабибов:

Sehen Sie sich den Grund an, warum es sich nicht auf Gold öffnet?

***

Fügen Sie den Codekorrektein: Verwenden Sie die Schaltfläche Code oder alternativ: Hängen Sie die Datei mit der Schaltfläche Datei anhängen
MQL5.community - Памятка пользователя
MQL5.community - Памятка пользователя
  • www.mql5.com
Теперь вы можете не только читать статьи и скачивать программы на языке MQL5, но и участвовать в обсуждении интересующих вас тем на Форуме, оставлять комментарии к статьям и опубликованным кодам. Кроме того, вы можете не только выкладывать собственные разработки в Code Base, но и публиковать Статьи, за которые мы предлагаем вознаграждение...
 
Наджибулло Хабибов:

Sehen Sie sich den Grund an, warum es sich nicht auf Gold öffnet?

***

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double KLot       = 1;        // умножение лота
extern double MaxLot     = 5;        // максимальный лот
extern double Profit     = 0;        // Профит в валюте
extern int StopLoss      = 0;        // Стоп Лось
extern int TakeProfit    = 0;        // ТейкПрофит
extern int BULevel       = 0;        // уровень БУ
extern int BUPoint       = 30;       // пункты БУ
extern int TrailingStop  = 0;        // трал
extern int StartHour     = 0;        // час начала торговли
extern int StartMin      = 30;       // минута начала торговли
extern int EndHour       = 23;       // час окончания торговли
extern int EndMin        = 30;       // минута окончания торговли
extern int Reverse       = 0;        // 1-реверс
extern int CloseSig      = 0;        // 1-закрытие по сигналу
extern int Slip          = 30;       // реквот
extern int Shift         = 1;        // на каком баре сигнал индикатора
extern int Magic         = 123;      // магик

extern string IndName    = "Aroow";
extern int SignalPeriod  = 9;

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool TimeSession(int aStartHour,int aStartMinute,int aStopHour,int aStopMinute,datetime aTimeCur)
  {
//--- время начала сессии
   int StartTime=3600*aStartHour+60*aStartMinute;
//--- время окончания сессии
   int StopTime=3600*aStopHour+60*aStopMinute;
//--- текущее время в секундах от начала дня
   aTimeCur=aTimeCur%86400;
   if(StopTime<StartTime)
     {
      //--- переход через полночь
      if(aTimeCur>=StartTime || aTimeCur<StopTime)
        {
         return(true);
        }
     }
   else
     {
      //--- внутри одного дня
      if(aTimeCur>=StartTime && aTimeCur<StopTime)
        {
         return(true);
        }
     }
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
     }

   r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   
   if(CountTrades()>0)
     {
      lot=NormalizeDouble(lot*MathPow(KLot,CountTrades()),2);
     }
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*_Point)
                 {
                  if(OrderStopLoss()<Bid-TrailingStop*_Point)
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*_Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if((OrderOpenPrice()-Ask)>TrailingStop*_Point)
                 {
                  if((OrderStopLoss()>(Ask+TrailingStop*_Point)) || (OrderStopLoss()==0))
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*_Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void BU()
  {
   bool m;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(OrderOpenPrice()<=(Bid-(BULevel+BUPoint)*_Point) && OrderOpenPrice()>OrderStopLoss())
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+BUPoint*_Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()>=(Ask+(BULevel+BUPoint)*_Point) && (OrderOpenPrice()<OrderStopLoss() || OrderStopLoss()==0))
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-BUPoint*_Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double AllProfit(int ot=-1)
  {
   double pr=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }

            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double blu = iCustom(NULL,0,IndName,SignalPeriod,4,Shift);
   double red = iCustom(NULL,0,IndName,SignalPeriod,5,Shift);
   double blu2 = iCustom(NULL,0,IndName,SignalPeriod,4,Shift+1);
   double red2 = iCustom(NULL,0,IndName,SignalPeriod,5,Shift+1);

   bool buy = blu<1000 && red2<1000;
   bool sell = red<1000 && blu2<1000;

   if(Reverse>0)
     {
      buy = red<1000 && blu2<1000;
      sell = blu<1000 && red2<1000;
     }

   if(BULevel>0)
      BU();
   if(TrailingStop>0)
      Trailing();
   if(AllProfit()>Profit && Profit>0)
      CloseAll();

   if(TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()) && t!=Time[0])
     {
      if(buy)
        {
         PutOrder(0,Ask);
        }
      if(sell)
        {
         PutOrder(1,Bid);
        }
      t=Time[0];
     }

   if(CountTrades()>0 && CloseSig>0)
     {
      if(sell)
        {
         CloseAll(0);
        }
      if(buy)
        {
         CloseAll(1);
        }
     }

   Comment("\n blu: ",blu,
           "\n red: ",red,
           "\n All Profit: ",AllProfit());
  }
//+------------------------------------------------------------------+