Criando um robô - página 8

 

MUITO OBRIGADO A TODOS VOCÊS!!!

O código do programa que cria o indicador ZigZagColor no gráfico atual e o remove depois de fechar a EA tem o seguinte aspecto

em bloco de inicialização da 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);

em bloco de desinicialização do Expert Advisor

(AVISO para aqueles que irão usar este código! Esta versão do código é um intermediário e só é aplicável às configurações do indicador Inp_ZZ_Depth = 80; Inp_ZZ_Deviation = 20; Inp_ZZ_Backstep = 0; em outras configurações, o indicador não será removido! Para apagar o indicador em outras configurações no bloco de desinicialização, é necessário especificá-las em vez de 80,20,0).

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

Agora tenho que entender como fazê-lo apagar o indicador após alterar suas configurações. Eu tentei a seguinte variante:

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

Ele limpa o indicador para todas as configurações, mas ao compilar a EA o editor gera 3 avisos sobre a conversão implícita de número para string:

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

Suspeito que tudo gira em torno destes valores: "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+". Bem, tenho que estudar mais a linguagem de programação MQL5.

Mais uma vez obrigado por sua gentil ajuda!

Atenciosamente, Vladimir.

 
MrBrooklin:

MUITO OBRIGADO A TODOS VOCÊS!!!

O código final que cria o indicador ZigZagColor no gráfico atual e o remove após o fechamento da EA se parece com o seguinte

em bloco de inicialização da EA

em bloco de desinicialização da EA

(AVISO para aqueles que irão usar este código! Esta versão do código é um intermediário e só é aplicável às configurações do indicador Inp_ZZ_Depth = 80; Inp_ZZ_Deviation = 20; Inp_ZZ_Backstep = 0; em outras configurações, o indicador não será removido! Para fazer o indicador apagar em outras configurações no bloco de desinicialização, especifique-as em vez de 80,20, 0).

Agora quero entender como fazê-lo apagar o indicador após alterar suas configurações. Eu tentei a seguinte variante:

Ele limpa o indicador para todas as configurações, mas ao compilar a EA o editor gera 3 avisos sobre a conversão implícita de número para string:

Suspeito que tudo gira em torno desses valores: "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+". Bem, tenho que estudar mais a linguagem de programação MQL5.

Mais uma vez obrigado por sua gentil ajuda!

Atenciosamente, Vladimir.

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

A advertência sobre uma conversão do tipo implícita. Para uma implementação rigorosa, a conversão implícita dá uma advertência.

Você deve digitar explicitamente. E na MT5 é sempre uma execução rigorosa. No MT4 você pode selecionar e não especificar em propriedades #propriedade estrita

 
SanAlex:

Eu mesmo sou autodidata - e eu mesmo copio dos códigos disponíveis, - O problema é que eu não sei como explicar como esculpir!? - algo dentro me diz como esculpir.

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

Eu sei o que eu moldei, faltando lá, também uma rede de arrasto para a linha.

Acrescentei a rede de arrasto.

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

Advertência sobre a conversão do tipo não-explícito. para execução reta (estrita) uma conversão não-explícita dá uma advertência.

Você deve lançar explicitamente os tipos. E na MT5 é sempre uma execução rigorosa. No MT4 você pode selecionar e não especificar nas propriedades #propriedade estrita

Você está certo, Valery! Nesta forma, tudo funciona como deveria. A versão final no bloco de inicialização da 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);

no bloco de desinicialização da EA:

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

Obrigado pela dica!

Cumprimentos, Vladimir.

 
Роман Жилин:

Oooh, muito obrigado, com tanta informação você pode conseguir fazer tanta coisa...

Estou prestes a partir em uma viagem de negócios, então estou pensando em ir mais fundo nos materiais que me foram dados, mas a codificação... Eu também poderia fazê-lo em uma folha de papel, seria uma boa ferramenta de treinamento...


Cumprimentos, romano

Bom dia a todos!

Enquanto Roman está fora em uma viagem de negócios e não participa deste tópico, continuarei a fazer perguntas sobre a linguagem de programação MQL5. Encontrei a Porcentagem Máxima de Risco Equivalente na biblioteca CodeBase em https://www.mql5.com/ru/code/2142. Decidi tentar implementar a abertura de posições de Compra e Venda em um simples Expert Advisor, mas não com um lote fixo, mas com o percentual máximo de risco patrimonial.

Aqui está o código fonte (removi todas as coisas desnecessárias para me concentrar na tarefa principal):

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

Eu inseri o código da biblioteca especificada nela. Eu obtive o seguinte código:

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

Mas o Expert Advisor continua trabalhando por um lote fixo, ou seja, o risco não é considerado. Por favor, informe o que fazer para fazer a porcentagem de risco do ganho de capital.

Cumprimentos, Vladimir.

Maximum Percentage of Equity Risk
Maximum Percentage of Equity Risk
  • www.mql5.com
Change Chart and Timeframe Модифицированные скрипты для быстрого изменения графиков и таймфреймов на всех графиках при помощи горячих клавиш. Apply Template Простой скрипт для применения шаблона и/или таймфрейма ко всем открытым графикам. Long position Простой скрипт...
 
Cavalheiros, há apenas uma página de discussão em todo o tópico, o resto é código. Não é suficiente apenas inserir os códigos?
 
MrBrooklin:

Bom dia a todos!

Enquanto Roman estiver fora em uma viagem de negócios e não participar ativamente deste tópico, continuarei a fazer perguntas sobre a linguagem de programação MQL5. Encontrei a Porcentagem Máxima de Risco Equivalente na biblioteca CodeBase em https://www.mql5.com/ru/code/2142. Decidi tentar implementar a abertura de posições de Compra e Venda em um simples Expert Advisor, mas não com um lote fixo, mas com o percentual máximo de risco patrimonial.

Aqui está o código fonte (removi todas as coisas desnecessárias para me concentrar na tarefa principal):

Eu inseri o código da biblioteca especificada nela. Eu obtive o seguinte código:

Mas o Expert Advisor continua trabalhando por um lote fixo, ou seja, o risco não é considerado. Por favor, informe o que fazer para fazer a porcentagem de risco do ganho de capital.

Meu respeito Vladimir.

Da maneira como você escreveu, é assim que funciona. Você precisa de uma linha, se Lote==0, então conte o lote de risco e atribua o valor de cálculo à variável Lote no final.

No Quaternário, desta forma, através de variáveis adicionais 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:
Cavalheiros, o tópico inteiro é uma página de discussão, o resto é código. Não é suficiente apenas inserir os códigos?

Como você ajuda então?

 
SanAlex:

Como você ajuda então?

Colocar apenas o que é pedido

 
Valeriy Yastremskiy:

É assim que é escrito e como funciona. Precisamos de uma linha se Lote==0 então contamos o lote de risco e no final atribuímos valor de cálculo à variável Lote.

No Quaternário é assim, através da variável adicional Lts

Obrigado, Valery, vou tentar à noite!

Atenciosamente, Vladimir.

Razão: