创建一个机器人 - 页 8

 

非常感谢你们

在当前图表上创建ZigZagColor指标并在关闭EA后将其删除的程序代码看起来像这样

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

在专家顾问的去初始化块中

(警告 那些将使用此代码的人!这个版本的代码是一个中间值,只适用于指标设置Inp_ZZ_Depth = 80;Inp_ZZ_Deviation = 20;Inp_ZZ_Backstep = 0;在其他设置下,指标不会被删除为了在去初始化块中删除其他设置的指标,你需要指定它们而不是80,20,0)。

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

现在我必须了解如何使它在改变指标的设置后删除该指标。我已经尝试了以下变体。

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

它清除了所有设置的 指标,但在编译EA时,编辑器产生了3个关于从数字到字符串的隐式转换 的警告。

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

我怀疑这一切都与这些价值观有关。"+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+".嗯,我必须进一步研究MQL5编程语言

再次感谢您的热心帮助!

真诚的,弗拉基米尔。

 
MrBrooklin:

非常感谢你们

在当前图表上创建ZigZagColor指标并在EA关闭后将其删除的最终代码看起来像这样

在EA的初始化区块中

在EA的去初始化块中

(警告 那些将使用此代码的人!这个版本的代码是一个中间值,只适用于指标设置Inp_ZZ_Depth = 80;Inp_ZZ_Deviation = 20;Inp_ZZ_Backstep = 0;在其他设置下,指标不会被删除要使指标在去初始化块中的其他设置下删除,请指定它们而不是80,20,0)。

现在我必须了解如何使它在改变指标的设置后删除该指标。我已经尝试了以下变体。

它清除了所有设置的 指标,但在编译EA时,编辑器产生了3个关于从数字到字符串的隐式转换 的警告。

我怀疑这一切都与这些价值观有关。"+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+".嗯,我必须进一步研究MQL5编程语言

再次感谢您的热心帮助!

真诚的,弗拉基米尔。

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

隐式类型转换的警告。 对于一个严格的实现,隐式转换给出了一个警告。

你应该明确地输入。而在MT5中,它总是严格执行。在MT4中,你可以在属性中选择和不指定#属性严格

 
SanAlex:

我自己是自学成才的--我自己从现有的代码中复制,--问题是我不知道如何解释如何雕刻!?- 内心的东西告诉我如何去雕刻。

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

我知道我的模子里有什么,缺了那里,也有一个Trawl的线。

我已经添加了拖网。

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)
附加的文件:
0006.mq5  109 kb
 
Valeriy Yastremskiy:

非显式类型转换的警告。对于直接(严格)执行,非显式转换会有警告。

你应该明确地铸造类型。而在MT5中,它总是严格执行。在MT4中,你可以在属性中选择和不指定#属性严格

你是对的,瓦莱里!就目前情况而言,一切都在正常工作。最终版本 在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);

在EA去初始化块中。

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

谢谢你的提示!

问候,弗拉基米尔。

 
Роман Жилин:

哦,非常感谢你,有了这么多的信息,你可以完成很多事情......

马上就要出差了,所以我想深入研究我所得到的材料,但编码...我也可以在一张纸上做,这将是一个很好的培训工具......


问候,罗曼

大家好!

由于罗曼出差在外,没有参与这个话题,我将继续提出关于MQL5编程语言的问题来代替。我在CodeBase中找到了 最大股权风险百分比,网址是https://www.mql5.com/ru/code/2142。 我决定尝试在一个简单的专家顾问中实现买入和卖出头寸的开仓,但不是用固定的手数,而是用股票风险的最大百分比。

以下是源代码(我删除了所有不必要的东西,以专注于主要任务)。

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

我把指定库中的代码插入其中。我得到了以下代码。

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

但专家顾问继续按固定手数工作,也就是说,不考虑风险。请告知如何做才能使资本收益的风险比例。

问候,弗拉基米尔。

Maximum Percentage of Equity Risk
Maximum Percentage of Equity Risk
  • www.mql5.com
Change Chart and Timeframe Модифицированные скрипты для быстрого изменения графиков и таймфреймов на всех графиках при помощи горячих клавиш. Apply Template Простой скрипт для применения шаблона и/или таймфрейма ко всем открытым графикам. Long position Простой скрипт...
 
先生们,整个主题中只有一页讨论,其余的都是代码。仅仅插入代码 还不够吗?
 
MrBrooklin:

祝大家今天愉快

当罗曼出差在外,没有积极参与这个话题时,我将继续提出关于MQL5编程语言的问题来代替。我在CodeBase中找到了 最大股权风险百分比,网址是https://www.mql5.com/ru/code/2142。 我决定尝试在一个简单的专家顾问中实现买入和卖出头寸的开仓,但不是用固定的手数,而是用股票风险的最大百分比。

以下是源代码(我删除了所有不必要的东西,以专注于主要任务)。

我把指定库中的代码插入其中。我得到了以下代码。

但专家顾问继续按固定手数工作,也就是说,不考虑风险。请告知如何做才能使资本收益的风险比例。

我尊敬的弗拉基米尔。

按照你的写法,这就是它的作用。你需要一行,如果Lot==0,那么计算风险的手数,并在最后将计算值分配给Lot变量。

在第四纪这种方式,通过额外的变量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:
先生们,整个话题只有一页的讨论,其余的都是代码。仅仅插入代码 还不够吗?

那么你如何帮助呢?

 
SanAlex:

那么你如何帮助呢?

只输入要求的内容

 
Valeriy Yastremskiy:

这是它的写法,也是它的工作方式。我们需要一个行,如果Lot==0,那么我们就计算风险手数,最后我们将计算值分配给Lot变量。

在第四纪,它是这样的,通过附加变量Lts

谢谢你,瓦列里,我晚上会试一试的。

真诚的,弗拉基米尔。