Creare un robot - pagina 8

 

GRAZIE MILLE A TUTTI VOI!!!

Il codice del programma che crea l'indicatore ZigZagColor sul grafico corrente e lo rimuove dopo la chiusura dell'EA si presenta così

in blocco di inizializzazione EA

//--- 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);

nel blocco di deinizializzazione di Expert Advisor

(ATTENZIONE per coloro che useranno questo codice! Questa versione del codice è intermedia ed è applicabile solo alle impostazioni dell'indicatore Inp_ZZ_Depth = 80; Inp_ZZ_Deviation = 20; Inp_ZZ_Backstep = 0; con altre impostazioni, l'indicatore non sarà rimosso! Per far sì che l'indicatore si cancelli ad altre impostazioni nel blocco di deinizializzazione, specificatele al posto di 80,20,0).

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

Ora devo capire come fargli cancellare l'indicatore dopo aver cambiato le sue impostazioni. Ho provato la seguente variante:

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

Cancella l'indicatore per tutte le impostazioni, ma quando si compila l'EA l'editor genera 3 avvertimenti sulla conversione implicita da numero a stringa:

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

Ho il sospetto che si tratti di questi valori: "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+". Beh, devo studiare ulteriormente il linguaggio di programmazione MQL5.

Grazie ancora per il vostro gentile aiuto!

Sinceramente, Vladimir.

 
MrBrooklin:

GRAZIE MILLE A TUTTI VOI!!!

Il codice finale che crea l'indicatore ZigZagColor sul grafico corrente e lo rimuove dopo la chiusura dell'EA appare così

in blocco di inizializzazione EA

nel blocco di deinizializzazione di EA

(ATTENZIONE per coloro che useranno questo codice! Questa versione del codice è intermedia ed è applicabile solo alle impostazioni dell'indicatore Inp_ZZ_Depth = 80; Inp_ZZ_Deviation = 20; Inp_ZZ_Backstep = 0; con altre impostazioni, l'indicatore non sarà rimosso! Per far sì che l'indicatore si cancelli ad altre impostazioni nel blocco di deinizializzazione, specificatele al posto di 80,20,0).

Ora devo capire come fargli cancellare l'indicatore dopo aver cambiato le sue impostazioni. Ho provato la seguente variante:

Cancella l'indicatore per tutte le impostazioni, ma quando si compila l'EA l'editor genera 3 avvertimenti sulla conversione implicita da numero a stringa:

Ho il sospetto che si tratti di questi valori: "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+". Beh, devo studiare ulteriormente il linguaggio di programmazione MQL5.

Grazie ancora per il vostro gentile aiuto!

Sinceramente, Vladimir.

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

L'avvertimento su una conversione implicita del tipo. Per un'implementazione rigorosa, la conversione implicita dà un avvertimento.

Dovreste digitare esplicitamente. E in MT5 è sempre l'esecuzione rigorosa. In MT4 è possibile selezionare e non specificare nelle proprietà #property strict

 
SanAlex:

Io stesso sono autodidatta - e copio dai codici disponibili, - Il problema è che non so come spiegare come scolpire! - qualcosa dentro mi dice come scolpire.

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

So che quello che ho modellato, che manca lì, è anche un Trawl per la linea.

Ho aggiunto la rete a strascico.

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)
File:
0006.mq5  109 kb
 
Valeriy Yastremskiy:

Avviso sulla conversione di tipo non esplicita. per l'esecuzione diretta (strict) una conversione non esplicita dà un avviso.

Dovreste lanciare esplicitamente i tipi. E in MT5 è sempre l'esecuzione rigorosa. In MT4 è possibile selezionare e non specificare nelle proprietà #property strict

Hai ragione, Valery! Così com'è, tutto funziona come dovrebbe. La versione finale nel blocco di inizializzazione EA:

//--- 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);

nel blocco di deinizializzazione EA:

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

Grazie per il suggerimento!

Saluti, Vladimir.

 
Роман Жилин:

Oooh, grazie mille, con tante informazioni si possono fare tante cose...

Stoper partire per un viaggio di lavoro, quindi sto pensando di approfondire il materiale che mi è stato dato, ma la codifica... Potrei farlo anche su un foglio di carta, sarebbe un buon strumento di allenamento...


Saluti, Roman

Buona giornata a tutti!

Mentre Roman è via per un viaggio di lavoro e non partecipa a questo argomento, continuerò invece a fare domande sul linguaggio di programmazione MQL5. Ho trovato la libreria Maximum Percentage of Equity Risk in CodeBase su https://www.mql5.com/ru/code/2142. Ho deciso di provare a implementare l'apertura di posizioni di acquisto e vendita in un semplice Expert Advisor, ma non con un lotto fisso, ma con la massima percentuale di rischio azionario.

Ecco il codice sorgente (ho rimosso tutte le cose inutili per concentrarmi sul compito principale):

//+------------------------------------------------------------------+
//|                                                  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;
  }
//+------------------------------------------------------------------+

Vi ho inserito il codice della libreria specificata. Ho ottenuto il seguente codice:

//+------------------------------------------------------------------+
//|                                                  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;
  }
//+------------------------------------------------------------------+

Ma l'Expert Advisor continua a lavorare con un lotto fisso, cioè il rischio non viene considerato. Si prega di consigliare cosa fare per rendere la percentuale di rischio della plusvalenza.

Saluti, Vladimir.

Maximum Percentage of Equity Risk
Maximum Percentage of Equity Risk
  • www.mql5.com
Change Chart and Timeframe Модифицированные скрипты для быстрого изменения графиков и таймфреймов на всех графиках при помощи горячих клавиш. Apply Template Простой скрипт для применения шаблона и/или таймфрейма ко всем открытым графикам. Long position Простой скрипт...
 
Signori, c'è solo una pagina di discussione in tutto il thread, il resto è codice. Non è sufficiente inserire i codici?
 
MrBrooklin:

Buona giornata a tutti voi!

Mentre Roman è via per un viaggio di lavoro e non partecipa attivamente a questo thread, continuerò invece a fare domande sul linguaggio di programmazione MQL5. Ho trovato la libreria Maximum Percentage of Equity Risk in CodeBase su https://www.mql5.com/ru/code/2142. Ho deciso di provare a implementare l'apertura di posizioni di acquisto e vendita in un semplice Expert Advisor, ma non con un lotto fisso, ma con la massima percentuale di rischio azionario.

Ecco il codice sorgente (ho rimosso tutte le cose inutili per concentrarmi sul compito principale):

Vi ho inserito il codice della libreria specificata. Ho ottenuto il seguente codice:

Ma l'Expert Advisor continua a lavorare con un lotto fisso, cioè il rischio non viene considerato. Si prega di consigliare cosa fare per rendere la percentuale di rischio della plusvalenza.

Il mio rispetto Vladimir.

Da come l'hai scritto, è così che funziona. Avete bisogno di una linea, se Lot==0, poi contate il lotto a rischio e assegnate il valore del calcolo alla variabile Lot alla fine.

Nel Quaternario in questo modo, attraverso la variabile aggiuntiva 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:
Signori, l'intero argomento è una pagina di discussione, il resto sono codici. Non è sufficiente inserire i codici?

Come si fa ad aiutare allora?

 
SanAlex:

Come si fa ad aiutare allora?

Mettete solo quello che vi viene chiesto

 
Valeriy Yastremskiy:

Ecco come è scritto e come funziona. Abbiamo bisogno di una linea se Lot==0 allora contiamo lotto rischioso e alla fine assegniamo il valore del calcolo alla variabile Lot.

Nel Quaternario è così, attraverso la variabile aggiuntiva Lts

Grazie, Valeriy, lo proverò in serata!

Sinceramente, Vladimir.

Motivazione: