脚本: Pending orders DOWN - 页 3

 
Михаил Рымарь:

您好,这个脚本非常棒,是 MQ5 上唯一的一个,但我想在我的武器库中也有同样的脚本,但数量要多一些,比如 1 或 0.5。

感谢您的辛勤劳动,祝您节日快乐。

在这个系列中,最初的想法是使用最小批量。因此,目前只能到此为止。

 
你好,先生。您能帮我一下吗?我怎样才能将代码调整到我想要的手数。我试过几次,改变了 inplots:我是新手,希望有办法改变它。谢谢
//+------------------------------------------------------------------+
//|挂单下降。mq5
//|版权 © 2017, 弗拉基米尔-卡尔普托夫 ||
//|http://wmua.ru/slesar/ ||
//+------------------------------------------------------------------+
#property copyright "版权归弗拉基米尔-卡尔普托夫 2017 所有
#property link      "http://wmua.ru/slesar/"
#property version   "1.002"
#property description "The script sets the pending orders down from the price"
#property script_show_inputs
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
CTrade         m_trade;                      // 交易对象
CSymbolInfo    m_symbol;                     // 符号信息对象
//+------------------------------------------------------------------+
//| 挂单枚举 DOWN|
//+------------------------------------------------------------------+
enum ENUM_PENDING_ORDERS_DOWN
  {
   buy_limit         =0,   // 购买限额
   sell_stop         =3    // 卖出止损
  };
//--- 输入参数
input ushort                     InpDownGep        = 10;             // 从当前价格向下挂单的缺口(以点为单位)
input ushort                     InpDownStep       = 3;             // 下达订单之间的间隔(以点为单位)
input ENUM_PENDING_ORDERS_DOWN   InpDownOrders     = buy_limit;      // 挂单类型 DOWN
input uchar                      InpDownQuantity   = 33;              // 下降数量
input double                     InpLots           = 5;            // 很多
input ushort                     InpStopLoss       = 100;             // 止损(单位:点)
input ushort                     InpTakeProfit     = 100;             // 止盈(点数)
//---
ulong                            m_slippage=1;                      // 滑动
double                           m_adjusted_point;                   // 点值调整为 3 点或 5 点
double                           ExtDownGep=0.0;
double                           ExtDownStep=0.0;
double                           ExtStopLoss=0.0;
double                           ExtTakeProfit=0.0;
//+------------------------------------------------------------------+
//| 脚本程序启动功能|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   if(InpLots<=0.0)
     {
      Print("The \"Lots\" can't be smaller or equal to zero");
      return;
     }
//---
   if(!m_symbol.Name(Symbol())) // 设置符号名称
      return;
   if(!RefreshRates())
      return;

   string err_text="";
   if(!CheckVolumeValue(InpLots,err_text))
     {
      Print(err_text);
      return;
     }
//---
   if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK))
      m_trade.SetTypeFilling(ORDER_FILLING_FOK);
   else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC))
      m_trade.SetTypeFilling(ORDER_FILLING_IOC);
   else
      m_trade.SetTypeFilling(ORDER_FILLING_RETURN);
//---
   m_trade.SetDeviationInPoints(m_slippage);
   m_trade.SetAsyncMode(true);
//--- 调整 3 或 5 位数
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;

   ExtDownGep     = m_adjusted_point * InpDownGep;
   ExtDownStep    = m_adjusted_point * InpDownStep;
   ExtStopLoss    = m_adjusted_point * InpStopLoss;
   ExtTakeProfit  = m_adjusted_point * InpTakeProfit;
//--- 开始工作
   double start_price_ask=m_symbol.Ask()-ExtDownGep;
   double start_price_bid=m_symbol.Bid()-ExtDownGep;
//--- 挂单下降
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_limit)
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(m_symbol.LotsMax(),m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(m_symbol.LotsMax(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
  }
//+------------------------------------------------------------------+
//| 刷新符号报价数据|
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- 刷新率
   if(!m_symbol.RefreshRates())
      return(false);
//--- 防止返回值为 "零"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| 检查订单量的正确性
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &error_description)
  {
//--- 允许的最低贸易量
   double min_volume=m_symbol.LotsMin();
   if(volume<min_volume)
     {
      error_description=StringFormat("Volume is less than the minimal allowed SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//-- 允许的最大贸易业务量
   double max_volume=m_symbol.LotsMax();
   if(volume>max_volume)
     {
      error_description=StringFormat("Volume is greater than the maximal allowed SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- 获得体积变化的最小步长
   double volume_step=m_symbol.LotsStep();

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      error_description=StringFormat("Volume is not a multiple of the minimal step SYMBOL_VOLUME_STEP=%.2f, the closest correct volume is %.2f",
                                     volume_step,ratio*volume_step);
      return(false);
     }
   error_description="Correct volume value";
   return(true);
  }
//+------------------------------------------------------------------+ 
//| 检查是否允许指定的填充模式 
//+------------------------------------------------------------------+ 
bool IsFillingTypeAllowed(int fill_type)
  {
//--- 获取描述允许填充模式的属性值 
   int filling=m_symbol.TradeFillFlags();
//--- 如果允许使用 fill_type 模式,则返回 true 
   return((filling & fill_type)==fill_type);
  }
//+------------------------------------------------------------------+

 
Mjame116 :
你好,先生。您能帮我一下吗?我怎样才能将代码调整到我想要的手数。我试过几次,改变了 inplots:我是新手,希望有办法改变它。谢谢

有必要将输入参数 Lots 替换为最小手数

//--- 挂单下降
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_limit)
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
  }

需要这样做:

//--- 挂单下降
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_limit)
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
  }
 
Vladimir Karputov:

有必要将输入参数Lots 设置为最小批量,而不是最小批量

需要这样做:

非常感谢先生,我真的很感激
 

你好,这个脚本很棒,运行得很好。

我正在使用同一个脚本来设置渔网,我想请教您:能否将它们合二为一?我的意思是一个脚本,可以同时设置向上和向下的订单网,长网和短网的参数相同。

 
mason_one:

您好,脚本很棒,运行正常。

我正在使用同一个脚本来设置渔网,我想请教您:能否将它们合二为一?我的意思是一个脚本,可以同时设置向上和向下的订单网,长网和短网的参数相同。

谢谢您的关注。我正在发布一个脚本(不是智能交易系统),该脚本可以设置一个向上和向下的挂单 网格 -挂单向上向下

 
您好,弗拉基米尔,您的脚本非常有趣,效果很好,但我希望您能告诉我如何将 lotaje 从 0.01 改为 0.03。我将继续关注并提前感谢您,我的朋友。
 
Carlos Devia :
您好,弗拉基米尔,您的脚本非常有趣,效果很好,但我希望您能告诉我如何将 lotaje 从 0.01 改为 0.03。我将继续关注并提前感谢您,我的朋友。

在这段代码中,请将"InpLots"改为"m_symbol.LotsMin()":

//--- 挂单下降
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_limit)
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
 

亲爱的弗拉基米尔,此时此刻你就像我的神。你不知道我一直在寻找这个问题,我真的很感激你能抽出时间回答我。我是一个对交易充满热情的人,我所知道的一点东西都是从像您这样的人那里学来的。

如果可以的话,我想问您最后一个问题。 我在键盘上设置了一个热键

我在键盘上设置了一个热键来激活我的卖出止损订单,但在激活之前,会打开一个窗口,我希望不要打开这个窗口,而只是立即执行我的订单。

现附上打开窗口的图片。

我希望得到您的帮助,使 Vladimir 的窗口不再出现,因为当窗口打开时,我必须"接受"参数,而这一过程会浪费我的时间。

附加的文件:
 
Carlos Devia :

亲爱的弗拉基米尔,此时此刻你就像我的神。你不知道我一直在寻找这个问题,我真的很感激你能抽出时间回答我。我是一个对交易充满热情的人,我所知道的一切都是从像您这样的人身上学到的。

如果可能的话,我想问您最后一个问题,我在键盘上设置了一个热键。

我在键盘上设置了一个热键来激活我的卖出止损单,但在激活之前会打开一个窗口,我不希望打开这个窗口,而只希望立即执行我的订单。

我附上打开窗口的图片。

我希望能得到您的帮助,使 Vladimir 的窗口不再出现,因为当窗口打开时,我必须 "接受 "参数,而在这个过程中我会浪费时间。

热键不是办法:无论如何,在启动时输入参数都是可见的。

我建议另一种方法:

  • 写一个顾问--一个面板,在面板中所有东西都有一个 "启动 "按钮。
  • 启动顾问时,一旦设置了输入参数
  • 启动后,图表上会出现一个小面板:点击面板上的 "开始 "按钮后,挂单就会被下达(所有参数都取自输入参数)。

面板示例:



您可以在市场 上搜索此类面板,或在自由职业者 服务中订购。