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

 
Andy Dufresne:

Hallo. Können Sie einem Trottel erklären, wie man ein Struktur-Array initialisiert? Für ein normales Array ist es ganz einfach

int HiddenFunc[3,2] = {1,2,3,4,5,6};

Aber wie sieht es mit der Anordnung der Strukturen aus? Initialisieren Sie ein Array mit dieser Struktur, zum Beispiel

struct MODE_KEY {string Key; bool Act;};

genau wie Klassen:
https://www.mql5.com/ru/docs/basis/types/classes


oder Arrays)

struct trade_settings
  {
   double take;         // значения цены фиксации прибыли
   double stop;         // значение цены защитного стопа
   uchar  slippage;     // значение допустимого проскальзывания
  };



   trade_settings ss[]={
                        {1.0, 2.0, 5},
                        {1.0, 2.0, 5},
                        {1.0, 2.0, 5}
                        };  
Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
  • www.mql5.com
Структуры, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Hallo.

Eulen testen. (der Code ist unten beigefügt).

owl verwendet Martingale auf der Grundlage früherer Aufträge (bei Verlusten wird das Los mit dem Martin-Koeffizienten multipliziert...).

die vorherige Order wurde durch einen Stop mit z.B. 0,2 Lot bei (Martin = 2...) geschlossen. dann schalte ich im MT4-Terminal "auto-trading" aus, oder schalte das Terminal ganz aus und die Eule hört auf zu handeln.

Wenn ich dann die Schaltfläche "Automatischer Handel" einschalte - Dann schaltet sich die Eule ein und öffnet das nächste Los mit einem Volumen von 0,4.

Wie kann man also den Code so korrigieren, dass die Eule, wenn man den "automatischen Handel" ausschaltet, das Terminal ausschaltet und dann wieder einschaltet, die nächste Handelssitzung mit dem Startlot beginnt,

(z. B. 0,01) und nicht mit dem letzten abgeschlossenen Vorgang in der Historie multipliziert?

//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, http://cmillion.ru"
#property link      "cmillion@narod.ru"
#property strict
#property description "Советник открывает позиции по индикатору RSI после SL увеличивает лот"
#property description "Следующая сделка не открывается, пока не закрыта предыдущая"
//-------------------------------------------------------------------
extern ENUM_TIMEFRAMES timeframe_RSI = 60;
extern int    period_RSI   = 14;
extern int    level_buy    = 30;
extern int    level_sell   = 70;

extern double Lot          = 0.1;
extern double K_Martin     = 2.0;

extern int    Stoploss     = 10,
              Takeprofit   = 50;
extern int    OrdersClose  = 5;

extern int    Magic        = 0;
extern int    DigitsLot    = 2;
extern int    slippage     = 3;
//-------------------------------------------------------------------
string AC;
datetime OpenTime;
double MINLOT,MAXLOT;
//-------------------------------------------------------------------
void OnTick()
{
   if (!IsTradeAllowed()) 
   {
      DrawLABEL("Торговля",0,0,0,Red,"Торговля запрещена");
      return;
   } 
   else DrawLABEL("Торговля",0,0,0,Lime,"Торговля разрешена");

   //---

   double STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   //---
   double OSL,OTP,OOP,SL,TP,Profit=0;
   int b=0,s=0,tip;
   for (int i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      { 
         if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
         { 
            tip = OrderType(); 
            OSL = NormalizeDouble(OrderStopLoss(),Digits);
            OTP = NormalizeDouble(OrderTakeProfit(),Digits);
            OOP = NormalizeDouble(OrderOpenPrice(),Digits);
            SL=OSL;TP=OTP;
            Profit+=OrderProfit()+OrderCommission()+OrderSwap();
            if (tip==OP_BUY)             
            {  
               b++; 
               if (OSL==0 && Stoploss!=0)
               {
                  if ((Bid-NormalizeDouble(OOP - Stoploss * Point,Digits)) / Point>=STOPLEVEL) SL = NormalizeDouble(OOP - Stoploss * Point,Digits);
               } 
               if (OTP==0 && Takeprofit!=0)
               {
                  if ((NormalizeDouble(OOP + Takeprofit * Point,Digits)-Ask) / Point>=STOPLEVEL) TP = NormalizeDouble(OOP + Takeprofit * Point,Digits);
               } 
               if (SL != OSL || TP != OTP)
               {  
                  if (!OrderModify(OrderTicket(),OOP,SL,TP,0,White)) Print("Error OrderModify ",GetLastError());
               }
            }                                         
            if (tip==OP_SELL)        
            {
               s++;
               if (OSL==0 && Stoploss!=0)
               {
                  if ((NormalizeDouble(OOP + Stoploss * Point,Digits)-Ask) / Point>=STOPLEVEL) SL = NormalizeDouble(OOP + Stoploss   * Point,Digits);
               }
               if (OTP==0 && Takeprofit!=0)
               {
                  if ((Bid-NormalizeDouble(OOP - Takeprofit * Point,Digits)) / Point>=STOPLEVEL) TP = NormalizeDouble(OOP - Takeprofit * Point,Digits);
               }
               if (SL != OSL || TP != OTP)
               {  
                  if (!OrderModify(OrderTicket(),OOP,SL,TP,0,White)) Print("Error OrderModify ",GetLastError());
               }
            } 
         }
      }
   }
   
   
   //---
   
   double AB = AccountBalance();
   
   //---
   
   DrawLABEL("Balance"        ,1,5,0,clrGreen,StringConcatenate("Balance ",DoubleToStr(AB,2),AC));
   DrawLABEL("Equity"         ,1,5,0,clrGreen,StringConcatenate("Equity ",DoubleToStr(AccountEquity(),2),AC));
   DrawLABEL("FreeMargin"     ,1,5,0,clrGreen,StringConcatenate("FreeMargin ",DoubleToStr(AccountFreeMargin(),2),AC));
   DrawLABEL("Take"           ,1,5,0,Color(Profit>0,Lime,Red),StringConcatenate("Profit ",DoubleToStr(Profit,2),AC));
   
   double Lots=0,RSI1=0,RSI0=0;
   if (b+s==0)
   {
      RSI0= iRSI (NULL,timeframe_RSI,period_RSI,PRICE_CLOSE,0);
      RSI1= iRSI (NULL,timeframe_RSI,period_RSI,PRICE_CLOSE,1);
   }
   else return;

   //---
   if (RSI0>=level_buy && RSI1<=level_buy)
   {
      Lots=LOT();

      if (Lots>MAXLOT) Lots = MAXLOT;
      if (Lots<MINLOT) Lots = MINLOT;
      
      if(SendOrder(OP_BUY, Lots, NormalizeDouble(Ask,Digits)))OpenTime=iTime(NULL,timeframe_RSI,1); 
   }

   //---
   
   if (RSI0<=level_sell && RSI1>=level_sell)
   {
      Lots=LOT();

      if (Lots>MAXLOT) Lots = MAXLOT;
      if (Lots<MINLOT) Lots = MINLOT;

      if(SendOrder(OP_SELL, Lots, NormalizeDouble(Bid,Digits))) OpenTime=iTime(NULL,timeframe_RSI,1); 
   }
}
//------------------------------------------------------------------
bool SendOrder(int tip, double lots, double price, double sl=0, double tp=0)
{
   if (tip<2)
   {
      if (AccountFreeMarginCheck(Symbol(),tip,lots)<0)
      {
         Alert("Недостаточно средств");
         return(0);
      }
   }
   for (int i=0; i<10; i++)
   {    
      if (OrderSend(Symbol(),tip, lots,price,slippage,sl,tp,NULL,Magic,0,clrNONE)!=-1) return(1);
         Alert(" попытка ",i," Ошибка открытия ордера ",Strtip(tip)," <<",(GetLastError()),">>  lot=",lots,"  pr=",price," sl=",sl," tp=",tp);
      Sleep(500);
      RefreshRates();
      if (IsStopped()) return(0);
   }
   return(0);
}
//------------------------------------------------------------------
string Strtip(int tip)
{
   switch(tip) 
   { 
   case OP_BUY:
      return("BUY"); 
   case OP_SELL:
      return("SELL"); 
   case OP_BUYSTOP:
      return("BUYSTOP"); 
   case OP_SELLSTOP:
      return("SELLSTOP"); 
   case OP_BUYLIMIT:
      return("BUYLIMIT"); 
   case OP_SELLLIMIT:
      return("SELLLIMIT"); 
   }
   return("error"); 
}
//------------------------------------------------------------------
void OnDeinit(const int reason)
{
   if (!IsTesting()) 
   {
      ObjectsDeleteAll(0);
   }
}
//-------------------------------------------------------------------
void DrawLABEL(string name, int CORNER, int X, int Y, color clr, string Name)
{
   if (ObjectFind(name)==-1)
   {
      ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
      ObjectSet(name, OBJPROP_CORNER, CORNER);
      ObjectSet(name, OBJPROP_XDISTANCE, X);
      ObjectSet(name, OBJPROP_YDISTANCE, Y);
   }
   ObjectSetText(name,Name,10,"Arial",clr);
}
//+------------------------------------------------------------------+
int OnInit()
{
   MINLOT = MarketInfo(Symbol(),MODE_MINLOT);
   MAXLOT = MarketInfo(Symbol(),MODE_MAXLOT);
   Comment("Start ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
   
   AC = StringConcatenate(" ", AccountCurrency());
   
   int Y=15;
   DrawLABEL("Торговля"  ,1,5,Y,Red,"Торговля ");Y += 20;
   DrawLABEL("Balance"   ,1,5,Y,clrGreen,StringConcatenate("Balance ",DoubleToStr(AccountBalance(),2),AC));Y += 15;
   DrawLABEL("Equity"    ,1,5,Y,clrGreen,StringConcatenate("Equity ",DoubleToStr(AccountEquity(),2),AC));Y += 15;
   DrawLABEL("FreeMargin",1,5,Y,clrGreen,StringConcatenate("FreeMargin ",DoubleToStr(AccountFreeMargin(),2),AC));Y += 30;

   DrawLABEL("Take"           ,1,5,Y,Lime,"Profit ");Y += 20;
   
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
color Color(bool P,color a,color b)
{
   if (P) return(a);
   else return(b);
}
//------------------------------------------------------------------
double LOT()
{
   int n=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_Martin,DigitsLot);
               n++;
               if (n>=OrdersClose) {Comment("1");return(Lot);}
            }
            else
            {
               if (n==0) {Comment("2");return(Lot);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
   return(OL);
}
//------------------------------------------------------------------


Программные помощники MQL для работы на финансовых рынках
  • cmillion.ru
Скрипт показывает максимальную и минимальную корреляцию на выбранном отрезке истории, например за последние 10000 свечей. Таким образом можно заранее проанализировать какие пары и как коррелируют. В параметрах задаем Тф период корреляции и период анализа корреляции. Зеленым цветом выделяются пары с прямой корреляцией у которых корреляция выше...
 
законопослушный гражданин:

Hallo.

Eulen testen. (der Code ist unten beigefügt).

owl verwendet Martingale auf der Grundlage früherer Aufträge (bei Verlusten wird das Los mit dem Martin-Koeffizienten multipliziert...).

die vorherige Order wurde durch einen Stop mit z.B. 0,2 Lot bei (martin =2...) geschlossen, dann schalte ich im MT4-Terminal "auto-trading" aus oder schalte das Terminal ganz aus und die Eule hört auf zu handeln.

Wenn ich dann die Schaltfläche "Automatischer Handel" einschalte - Dann schaltet sich die Eule ein und öffnet das nächste Los mit einem Volumen von 0,4.

Wie kann man also den Code so korrigieren, dass die Eule, wenn man den "automatischen Handel" ausschaltet, das Terminal ausschaltet und dann wieder einschaltet, die nächste Handelssitzung mit dem Startlot beginnt,

(z. B. 0,01) und nicht mit dem letzten abgeschlossenen Vorgang in der Historie multipliziert?

Sie erstellen eine globale Variable

datetime Start;

int OnInit()
{
   Start=TimeCurrent();
.....................
}
void OnTick()
{
   if (!IsTradeAllowed()) 
   {
      DrawLABEL("Торговля",0,0,0,Red,"Торговля запрещена");
      Start=TimeCurrent();
      return;
   } 
.....................
}

und dann, wenn es keine offenen/geschlossenen Aufträge gibt, später "Start".

Lots=Lot;
 
MakarFX:

Sie erstellen eine globale Variable

und dann, wenn es keine offenen/geschlossenen Aufträge gibt, später "Start".

Ich danke Ihnen.

Ich habe bereits eine datetime OpenTime; - sollte sie durchdatetime Start ersetzt oder hinzugefügt werden?

"Wenn es keine offenen/geschlossenen Aufträge nach "Start "Lots=Lot; " gibt, ist überhaupt nicht klar, was damit zu tun ist.

 
законопослушный гражданин:

Ich danke Ihnen.

Ich habe bereits datetime OpenTime; - sollte es durchdatetime Start ersetzt oder hinzugefügt werden?

"und dann, wenn später keine offenen/geschlossenen Aufträge vorhanden sind "Start "Lots=Lot; " - es ist überhaupt nicht klar, worauf man sich beziehen soll?

Beschreiben Sie in aller Kürze, was Sie von diesem EA erwarten (die Logik seiner Arbeit),

Ich glaube, Sie haben eine Menge unnötiger Dinge in Ihrem Code oder ich verstehe etwas nicht.

 
Um einen Indikator hinzuzufügen, wenn man ihm einen anderen Indikator-Handle (wie applied_price) übergibt, muss dieser andere nur einen Puffer haben? Oder ist es möglich, mehrere Puffer zu haben? Wenn es mehr als einen gibt, nimmt in diesem Fall der erste Indikator nur Daten aus dem Nullpuffer des zweiten Indikators?
 

Guten Tag. Hilfe mit dem EA. Nach der Strategie, wenn ein Stop ausgelöst, dann sollte der EA hinzufügen (die Anzahl der Punkte), um die nächste Reihe takeaway
aus der Geschichte von ID, aber es tut es nicht aus irgendeinem Grund.

Was ist an dem Code falsch?

if(isLimitOn && OrderSelect(OrderMagicNumber(), SELECT_BY_TICKET, MODE_HISTORY)){
            tpc += stop_loss;
            if(OrderSelect(lastMagic, SELECT_BY_TICKET)){
               if(OrderType() == OP_BUY) {
                  double tp_price = NormalizeDouble((OrderOpenPrice() + Point() * (tp + tpc)), Digits);
                  if(!OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), tp_price, OrderExpiration()))
                     Print("Ошибка модификации ордера:", GetLastError());
               }else if(OrderType() == OP_SELL){
                  double tp_price = NormalizeDouble((OrderOpenPrice() - Point() * (tp + tpc)), Digits);
                  if(!OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), tp_price, OrderExpiration()))
                     Print("Ошибка модификации ордера:", GetLastError());
               }
            }
               
            isLimitOn = false;
         }
 
SGarnov:

Guten Tag. Hilfe mit dem EA. Nach der Strategie, wenn ein Stop ausgelöst, dann sollte der EA hinzufügen (die Anzahl der Punkte), um die nächste Reihe takeaway
aus der Geschichte von ID, aber es tut es nicht aus irgendeinem Grund.

Was ist an dem Code falsch?

es ist nicht klar, dass es sich um "OrderMagicNumber()" und "stop_loss" handelt
 
verifiziert?
 
Hallo, ich brauche einen Berater. Wo kann ich einen vertrauenswürdigen Anbieter finden?
Grund der Beschwerde: