新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 950

 
Rustam Bikbulatov:

这个函数在每个订单上写一个数字,或者说是批量*100。

现在我们需要一个反函数,显示最后一个数字是什么

试试吧。

double value = StringToDouble(ObjectGetString(0,object_name,OBJPROP_TEXT)); 

如果对象包含文本(不是数字),你需要添加StringSubstr()

double value = StringToDouble( StringSubstr(ObjectGetString(0,object_name,OBJPROP_TEXT),begin_index,length));

begin_index - 字符串中的索引,从零开始,length - 数字值的长度(该数字占据多少个字符)...我想是的

 
Yevhenii Levchenko:

试试这个。

如果该对象有文本(而不是数字),则添加StringSubstr()。

begin_index - 字符串中的索引,从0开始,length - 数字的长度(该数字占据多少个字符)...我想是的

那么,最初你将不得不在图上寻找这些所有的数字。它只是不会那样工作。这就是问题所在,已经检查过了。

 
Yevhenii Levchenko:

试试这个。

如果对象有文本(不是数字),则添加StringSubstr()。

begin_index - 字符串中的索引,从0开始,length - 数字值的长度(该数字占据多少个字符)...我想是的

   bool name;
        for(int i=0; i<ObjectsTotal(0,"LOTB"+OrderTicket(),OBJ_TEXT); i++)
     {
      name = ObjectSetString(0,"LOTB"+OrderTicket(),OBJ_TEXT,0);
      Comment("   ",name); 
   }

与这个类似,但它不起作用。 它显示为零。

 
Rustam Bikbulatov:

像这个,但它不工作。 它显示为零。

你想设置一个值还是取一个值?ObjectSetString()函数 设置一个文本 值并返回 一个bool 值。这不是它。而在循环头中,我认为它不是正确的......在ObjectsTotal()中......我是以mt4为参考的。或者是mt5代码?

 
Yevhenii Levchenko:

你需要设置一个值还是取一个值?ObjectSetString()函数 设置一个文本 值并返回 一个bool 值。这不是它。而在循环头,我认为它的框架不正确,ObjectsTotal()在哪里。我是以mt4为参考的。或者是mt5代码?

这就是MT4。

 

再一次,大家好!

我对我上面提出的问题仍然不满意,但我要求在代码方面给予帮助。

这是一个关于交易、自动交易系统和策略测试的论坛。

关于MQL4和MQL5的任何新手问题,关于算法和代码的帮助和讨论

布鲁克林先生, 2019.08.30 14:15

大家好!!!!!。

这里是Metatrader5的部分脚本代码。

#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---- показывать входные параметры
#property script_show_inputs
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Enum Stop or Limit                                               |
//+------------------------------------------------------------------+
enum ENUM_STOP_OR_LIMIT
  {
   stop=0,     // Buy stop and Sell stop
   limit=1     // Buy limit and Sell limit
  };
//--- input parameters
input ushort               InpUpGap          = 15;    // Gap for pending orders UP from the current price (in points)
input ushort               InpUpStep         = 30;    // Step between orders UP (in points)

input ushort               InpDownGap        = 15;    // Gap for pending orders DOWN from the current price (in points)
input ushort               InpDownStep       = 30;    // Step between orders DOWN (in points)

input ENUM_STOP_OR_LIMIT   InpPending        = stop;  // Type of pending orders

input uchar                InpUpQuantity     = 1;     // UP quantity orders
input uchar                InpDownQuantity   = 1;     // DOWN quantity orders

input double               InpLots           = 0.01;  // Lots
input ushort               InpStopLoss       = 50;    // Stop Loss (in points)
input ushort               InpTakeProfit     = 50;    // Take Profit (in points)
//---
ulong                      m_slippage=30;             // slippage

double                     ExtUpGap=0.0;
double                     ExtUpStep=0.0;

double                     ExtDownGap=0.0;
double                     ExtDownStep=0.0;

double                     ExtStopLoss=0.0;
double                     ExtTakeProfit=0.0;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   if(InpLots<=0.0)
     {
      Print("The \"Lots\" can't be smaller or equal to zero");
      return;
     }
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
      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);

//---
   ExtUpGap = m_symbol.Point() * InpUpGap;
   ExtUpStep = m_symbol.Point() * InpUpStep;

   ExtDownGap = m_symbol.Point() * InpDownGap;
   ExtDownStep = m_symbol.Point() * InpDownStep;

   ExtStopLoss = m_symbol.Point() * InpStopLoss;
   ExtTakeProfit = m_symbol.Point() * InpTakeProfit;

//--- start work
   double start_price_ask=m_symbol.Ask()-ExtUpGap;
   double start_price_bid=m_symbol.Bid()+ExtDownGap;

//--- set pending orders
   for(int i=0; i<InpUpQuantity; i++)
     {
      double price_ask = start_price_ask+i*ExtUpStep;
      double price_bid = start_price_bid+i*ExtUpStep;
      if(InpPending==stop)
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyStop(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.SellLimit(InpLots,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(InpPending==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));
        }
     }
  }

脚本应该在离卖出价和买入价一定距离的地方放置待定限价单,或者放置止损单。 限价挂单 的设置没有任何问题,但止损挂单 却没有。请帮助我理解为什么买入止损和卖出止损的挂单没有被设置。

你真诚的,弗拉基米尔。

只是想追问一下:有没有办法在市场关闭时(比如周末)测试脚本?

真诚的,弗拉基米尔。

 
Artyom Trishkin:

从哪个名单中?

并请使用编辑器中的样式器(Ctrl+<)。

哪些东西应该从哪里取?

你能给我一个提示吗?

 
MrBrooklin:

再一次,大家好!

没有人回应我之前提出的问题,但我仍在寻求代码方面的帮助。

还有一个问题:有没有办法在市场关闭时(如周末)测试该脚本?

真诚的,弗拉基米尔。

不,该脚本不会在封闭的市场中工作 - 它不会下订单。

为了理解这些错误,试着把你计算设置水平的相对价格值和你发送给交易订单 的所有价格水平值打印到日志中。

 
嗨,伙计们。在一个开放的订单旁边写了很多。
for(int no1=0; no1<OrdersTotal(); no1++)
  {
   if(OrderSelect(no1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderType()== OP_BUY)
        {
         ObjectCreate("LOTB"+OrderTicket(),OBJ_TEXT,0,TimeCurrent(),OrderOpenPrice());
         ObjectSetText("LOTB"+OrderTicket(),OrderLots()*100,20,"Arial",clrWheat);
         ObjectSetInteger(0,"LOTB"+OrderTicket(),OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
        }
     }
  } 
你能告诉我如何在代码的另一部分从这个列表中提取最后的文本吗?
 
Rustam Bikbulatov:

你能给我一个提示吗?

你需要找到最后打开的订单。找到它的票。然后使用对象名称的列表来寻找子串的出现,并在对象名称行中找到最后一个订单的票。只要在对象名称中找到最后订单的票据,这就是必要的图形对象。剩下的就是要从这个图形对象中提取你需要的东西。