Erstellen eines Roboters - Seite 8

 

ICH DANKE IHNEN ALLEN SEHR!!!

Der Programmcode, der den ZigZagColor-Indikator auf dem aktuellen Chart erstellt und nach dem Schließen des EA wieder entfernt, sieht wie folgt aus

im Block der EA-Initialisierung

//--- create handle of the indicator iCustom
   handle_iCustom=iCustom(m_symbol.Name(),Period(),"Examples\\ZigzagColor",
                          Inp_ZZ_Depth,
                          Inp_ZZ_Deviation,
                          Inp_ZZ_Backstep);
   ChartIndicatorAdd(ChartID(),0,handle_iCustom);

im Block der Deinitialisierung des Expert Advisors

(WARNUNG für diejenigen, die diesen Code verwenden werden! Diese Version des Codes ist eine Zwischenstufe und gilt nur für die Indikatoreinstellungen Inp_ZZ_Depth = 80; Inp_ZZ_Deviation = 20; Inp_ZZ_Backstep = 0; bei anderen Einstellungen wird der Indikator nicht entfernt! Um den Indikator bei anderen Einstellungen im Deinitialisierungsblock zu löschen, geben Sie diese anstelle von 80,20,0) an.

//---
  ChartIndicatorDelete(0,0,"ZigZag(80,20,0)");

Jetzt möchte ich wissen, wie ich den Indikator nach der Änderung seiner Einstellungen löschen kann. Ich habe die folgende Variante ausprobiert:

//---
  ChartIndicatorDelete(0,0,"ZigZag("+Inp_ZZ_Depth+","+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+")");

Es löscht den Indikator für alle Einstellungen, aber beim Kompilieren des EA erzeugt der Editor 3 Warnungen über die implizite Umwandlung von Zahlen in Strings:

implicit conversion from 'number' to 'string'   ZigZag_Fibonacci_(M1).mq5       230     38

Ich vermute, es geht um diese Werte: "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+". Nun, ich muss die Programmiersprache MQL5 weiter studieren.

Nochmals vielen Dank für Ihre freundliche Hilfe!

Mit freundlichen Grüßen, Vladimir.

 
MrBrooklin:

ICH DANKE IHNEN ALLEN SEHR!!!

Der endgültige Code, der den ZigZagColor-Indikator auf dem aktuellen Diagramm erstellt und ihn nach dem Schließen des EA wieder entfernt, sieht wie folgt aus

im Block der EA-Initialisierung

im Block der Deinitialisierung von EA

(WARNUNG für diejenigen, die diesen Code verwenden werden! Diese Version des Codes ist eine Zwischenstufe und gilt nur für die Indikatoreinstellungen Inp_ZZ_Depth = 80; Inp_ZZ_Deviation = 20; Inp_ZZ_Backstep = 0; bei anderen Einstellungen wird der Indikator nicht entfernt! Um den Indikator bei anderen Einstellungen im Deinitialisierungsblock zu löschen, geben Sie diese anstelle von 80,20,0) an.

Jetzt möchte ich wissen, wie ich den Indikator nach der Änderung seiner Einstellungen löschen kann. Ich habe die folgende Variante ausprobiert:

Es löscht den Indikator für alle Einstellungen, aber beim Kompilieren des EA erzeugt der Editor 3 Warnungen über die implizite Umwandlung von Zahlen in Strings:

Ich vermute, es geht um diese Werte: "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+". Nun, ich muss die Programmiersprache MQL5 weiter studieren.

Nochmals vielen Dank für Ihre freundliche Hilfe!

Mit freundlichen Grüßen, Vladimir.

 ChartIndicatorDelete(0,0,"ZigZag("+(string)Inp_ZZ_Depth+","+(string)Inp_ZZ_Deviation+","+(string)Inp_ZZ_Backstep+")");

Die Warnung bei einer impliziten Typkonvertierung. Bei einer strikten Implementierung gibt die implizite Konvertierung eine Warnung aus.

Sie sollten explizit eingeben. Und im MT5 ist es immer die strikte Ausführung. In MT4 können Sie in den Eigenschaften #property strict auswählen und nicht angeben

 
SanAlex:

Ich bin selbst Autodidakt - und ich kopiere die verfügbaren Codes selbst, - Das Problem ist, dass ich nicht weiß, wie ich erklären soll, wie man sculpt!? - etwas in mir sagt mir, wie ich formen soll.

----------------------------------

Ich weiß, was ich gegossen habe, da fehlt auch ein Schleppnetz für die Linie.

Ich habe das Schleppnetz hinzugefügt.

input string   t0="---- Trailing Line:      -----";              //
input ushort   InpObjTrailingStop           = 0;                 // Obj: Trailing Stop (distance from price to object, in pips)
input ushort   InpObjTrailingStep           = 0;                 // Obj: Trailing Step, in pips (1.00045-1.00055=1 pips)
input string   t1="---- Line Name           -----";              //
input string   InpObjUpName                 = "Имя Линии Up";    // Obj: Up (Trailing Horizontal Line) or Trend Line)
input ENUM_TRADE_COMMAND InpTradeCommand    = UpName_s;          // Obj:  command: UP
input string   InpObjDownName               = "Имя Линии Down";  // Obj: Down (Trailing Horizontal Line) or Trend Line)
input ENUM_TRADE_COMMAND InTradeCommand     = DownName_b;        // Obj:  command: DOWN
input ushort   InpObjStep                   = 15;                // Obj: Step (distance from price to object, in pips)
Dateien:
0006.mq5  109 kb
 
Valeriy Yastremskiy:

Warnung bei nicht-expliziter Typkonvertierung. Bei direkter (strikter) Ausführung führt eine nicht-explizite Konvertierung zu einer Warnung.

Sie sollten die Typen explizit casten. Und im MT5 ist es immer die strikte Ausführung. In MT4 können Sie in den Eigenschaften #property strict auswählen und nicht angeben

Du hast Recht, Valery! Im Moment funktioniert alles so, wie es sollte. Die endgültige Fassung im Block der EA-Initialisierung:

//--- create handle of the indicator iCustom
   handle_iCustom=iCustom(m_symbol.Name(),Period(),"Examples\\ZigzagColor",
                          Inp_ZZ_Depth,
                          Inp_ZZ_Deviation,
                          Inp_ZZ_Backstep);
   ChartIndicatorAdd(ChartID(),0,handle_iCustom);

in dem EA-Deinitialisierungsblock:

ChartIndicatorDelete(0,0,"ZigZag("+(string)Inp_ZZ_Depth+","+(string)Inp_ZZ_Deviation+","+(string)Inp_ZZ_Backstep+")");

Danke für den Tipp!

Mit freundlichen Grüßen, Vladimir.

 
Роман Жилин:

Oooh, vielen Dank, mit so vielen Informationen kann man so viel erreichen...

Ich stehe kurz vor einer Geschäftsreise und möchte das mir zur Verfügung gestellte Material vertiefen, aber die Codierung... Ich könnte es auch auf einem Blatt Papier machen, das wäre ein gutes Trainingstool...


Mit freundlichen Grüßen, Roman

Guten Tag zusammen!

Während Roman auf einer Geschäftsreise ist und sich nicht an diesem Thema beteiligt, werde ich stattdessen weiterhin Fragen zur Programmiersprache MQL5 stellen. Ich habe die Bibliothek " Maximum Percentage of Equity Risk" in der CodeBase unter https://www.mql5.com/ru/code/2142 gefunden . Ich beschloss zu versuchen, die Eröffnung von Kauf- und Verkaufspositionen in einem einfachen Expert Advisor zu implementieren, aber nicht mit einem festen Lot, sondern mit dem maximalen Prozentsatz des Aktienrisikos.

Hier ist der Quellcode (ich habe alles Unnötige entfernt, um mich auf die Hauptaufgabe zu konzentrieren):

//+------------------------------------------------------------------+
//|                                                  11111111111.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

input int      TakeProfit=300; //Тейк-профит
input int      StopLoss=250;  //Стоп-лосс
input double   lot=0.1;        //Лот

double Ask;
double Bid;
//+------------------------------------------------------------------+
//| Функция открытия длинной (Long) позиции.                         |
//+------------------------------------------------------------------+
int OpenLong(double volume=0.1,
             int slippage=10,
             string comment="Long",
             int magic=0)
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   ZeroMemory(my_trade);
   my_trade.action=TRADE_ACTION_DEAL;
   my_trade.symbol=Symbol();
   my_trade.volume=NormalizeDouble(volume,1);
   my_trade.price=NormalizeDouble(Ask,_Digits);
   my_trade.sl=NormalizeDouble(Ask-StopLoss*_Point,_Digits);
   my_trade.tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   my_trade.deviation=slippage;
   my_trade.type=ORDER_TYPE_BUY;
   my_trade.type_filling=ORDER_FILLING_FOK;
   my_trade.comment=comment;
   my_trade.magic=magic;
   ResetLastError();

   if(OrderSend(my_trade,my_trade_result))
     {
      Print("Код результата операции - ",my_trade_result.retcode);
     }
   else
     {
      Print("Код результата операции - ",my_trade_result.retcode);
      Print("Ошибка открытия ордера = ",GetLastError());
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| функция открытия короткой (Short) позиции.                       |
//| Аналогична функции открытия длинной позиции.                     |
//+------------------------------------------------------------------+
.
.
.
.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
void OnTick()
  {
.   double Open[];
.
.
         if(Open[1]>(Open[2]))
           {
            OpenShort(lot,10,"Short",1234);
            return;
           }
         if((Open[1]<Open[2])
           {
            OpenLong(lot,10,"Long",1234);
            cantrade=false;
            return;
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+

Ich habe den Code aus der angegebenen Bibliothek in die Datei eingefügt. Ich habe den folgenden Code erhalten:

//+------------------------------------------------------------------+
//|                                                  11111111111.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\SymbolInfo.mqh> // добавлено из библиотеки

input int      TakeProfit=300; //Тейк-профит
input int      StopLoss=250;  //Стоп-лосс
input double   lot=0.1;        //Лот
input double   MaximumPercentageRisk=25; //Риск - добавлено из библиотеки

bool UseMaximumPercentageRisk=true; // добавлено из библиотеки
double Ask;
double Bid;
//--- этот блок добавлен из библиотеки
//+------------------------------------------------------------------+
//|  GetLotSize RPTrade                                              |
//+------------------------------------------------------------------+
double GetLotSize(double lotsize)
  {
//--- Gets pair specs  
   CSymbolInfo symInfo;
   int  digits_bn=symInfo.Digits();
   double  points_bn=symInfo.Point();
   string symbol_bn=_Symbol;
//--- adjust lot 
   int tmpdecimal=1;
   double old_lot=lotsize;
//---
   if((NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*(MaximumPercentageRisk/100)/1000.0,tmpdecimal)<lotsize) 
   && UseMaximumPercentageRisk) //лот подходит под риск ?
     {
      lotsize=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)
      *(MaximumPercentageRisk/100)/1000.0,tmpdecimal);  //расчет нового размера лота 

      if(lotsize<SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_MIN)) //размер лота подходит под минимльный размер лота брокера ?
        {
         lotsize=SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_MIN); //Нет! Настройка размера лота под минимальный размер лота брокера
         Print(_Symbol," Lot adjusted from ",old_lot," для уменьшения размера разрешенного сервером ",lotsize);
        }
      else
        {
         Print(_Symbol," Lot adjusted from ",old_lot,
         " to ",lotsize," для соответствия условию максимального риска. В каждой сделке рисковать можно только ",
         MaximumPercentageRisk,"% от свободной маржи.");   //Да! 
         if(MathAbs(lotsize/SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP)
         -MathRound(lotsize/SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP)))>1.0 E-10) //Размер лота подходит под разрешенный шаг брокера ?
           {
            lotsize=SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP)
            *NormalizeDouble(lotsize/SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP),0);   //НЕТ! Перерасчет размера лота.    
            Print("M-",_Symbol," Warning: Your calculated percentage at risk lot size of was not a multiple of minimal step",
            SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP),". Размер лота изменился до",lotsize);
           }
        }
     }
   return(lotsize);
 }

//+------------------------------------------------------------------+
//| Функция открытия длинной (Long) позиции.                         |
//+------------------------------------------------------------------+
int OpenLong(double volume=0.1,
             int slippage=10,
             string comment="Long",
             int magic=0)
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   ZeroMemory(my_trade);
   my_trade.action=TRADE_ACTION_DEAL;
   my_trade.symbol=Symbol();
   my_trade.volume=NormalizeDouble(volume,1);
   my_trade.price=NormalizeDouble(Ask,_Digits);
   my_trade.sl=NormalizeDouble(Ask-StopLoss*_Point,_Digits);
   my_trade.tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   my_trade.deviation=slippage;
   my_trade.type=ORDER_TYPE_BUY;
   my_trade.type_filling=ORDER_FILLING_FOK;
   my_trade.comment=comment;
   my_trade.magic=magic;
   ResetLastError();

   if(OrderSend(my_trade,my_trade_result))
     {
      Print("Код результата операции - ",my_trade_result.retcode);
     }
   else
     {
      Print("Код результата операции - ",my_trade_result.retcode);
      Print("Ошибка открытия ордера = ",GetLastError());
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| функция открытия короткой (Short) позиции.                       |
//| Аналогична функции открытия длинной позиции.                     |
//+------------------------------------------------------------------+
.
.
.
.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
void OnTick()
  {
.   double Open[];
.
.
         if(Open[1]>(Open[2]))
           {
            OpenShort(lot,10,"Short",1234);
            return;
           }
         if((Open[1]<Open[2])
           {
            OpenLong(lot,10,"Long",1234);
            cantrade=false;
            return;
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+

Der Expert Advisor arbeitet aber mit einem festen Lot weiter, d.h. das Risiko wird nicht berücksichtigt. Was ist zu tun, um den Risikoprozentsatz des Kapitalgewinns zu erreichen?

Mit freundlichen Grüßen, Vladimir.

Maximum Percentage of Equity Risk
Maximum Percentage of Equity Risk
  • www.mql5.com
Change Chart and Timeframe Модифицированные скрипты для быстрого изменения графиков и таймфреймов на всех графиках при помощи горячих клавиш. Apply Template Простой скрипт для применения шаблона и/или таймфрейма ко всем открытым графикам. Long position Простой скрипт...
 
Meine Herren, es gibt nur eine Seite des gesamten Threads, auf der diskutiert wird, der Rest ist Code. Reicht es nicht aus, die Codes einfach einzugeben?
 
MrBrooklin:

Einen guten Tag an Sie alle!

Während Roman auf einer Geschäftsreise ist und sich nicht aktiv an diesem Thread beteiligt, werde ich stattdessen weiterhin Fragen zur Programmiersprache MQL5 stellen. Ich habe die Bibliothek " Maximum Percentage of Equity Risk" in der CodeBase unter https://www.mql5.com/ru/code/2142 gefunden . Ich beschloss zu versuchen, die Eröffnung von Kauf- und Verkaufspositionen in einem einfachen Expert Advisor zu implementieren, aber nicht mit einem festen Lot, sondern mit dem maximalen Prozentsatz des Aktienrisikos.

Hier ist der Quellcode (ich habe alles Unnötige entfernt, um mich auf die Hauptaufgabe zu konzentrieren):

Ich habe den Code aus der angegebenen Bibliothek in die Datei eingefügt. Ich habe den folgenden Code erhalten:

Der Expert Advisor arbeitet jedoch mit einem festen Lot weiter, d.h. das Risiko wird nicht berücksichtigt. Was ist zu tun, um den Risikoprozentsatz des Kapitalgewinns zu erreichen?

Mein Respekt, Vladimir.

So wie Sie es geschrieben haben, funktioniert es. Sie brauchen eine Zeile, wenn Lot==0, dann zählen Sie das riskante Lot und weisen den Berechnungswert am Ende der Lot-Variablen zu.

Im Quartär auf diese Weise, durch zusätzliche Variable Lts

bool CheckMoneyForTrade()
 {
 RefreshRates();                              // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);        // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера
 
   if (Lots > 0)                                // Если заданы лоты,то 
      Lts =Lots;                                // с ними и работаем 
   else                                         // % свободных средств
      Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Для открытия
 
   if(Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                      // Лот дороже свободн.
     {
      Alert(" Not enough money for ", Lts," lots");
     Work=false;
      return(false) ;                                   // Выход из функции()
     }
     return(true);
     }
 
VVT:
Meine Herren, das ganze Thema ist eine Seite der Diskussion, der Rest ist Code. Reicht es nicht aus, die Codes einfach einzugeben?

Wie können Sie dann helfen?

 
SanAlex:

Wie können Sie dann helfen?

Geben Sie nur das ein, wonach Sie gefragt werden

 
Valeriy Yastremskiy:

So ist es geschrieben und so funktioniert es. Wir brauchen eine Zeile, wenn Lot==0, dann zählen wir das riskante Lot und am Ende weisen wir der Variablen Lot einen Berechnungswert zu.

Im Quartär ist es so, durch zusätzliche Variable Lts

Danke, Valeriy, ich werde es am Abend ausprobieren!

Mit freundlichen Grüßen, Vladimir.