初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1128

 

你好,我的系统函数OrderCalcProfit有一个奇怪的行为,我感觉在计算中忽略了体积参数,即利润值总是按体积1.0计算。

我正试图在测试器中对不同的货币对在不同的模拟账户上进行检查。

1.1.0的计算是正确的,见calc_profi101.png。

2.函数的 第二次和任何后续调用 返回的利润结果是基于1.0的成交量,成交量的值被忽略了,请看一个截图(calc_profit02.png)--传递了成交量0.5,但结果还是和1.0的一样

你能告诉我问题可能是什么吗?谢谢

附加的文件:
 
aveshoff:

你好,我的系统函数OrderCalcProfit有一个奇怪的行为,我感觉在计算中忽略了体积参数,也就是说,利润大小总是按体积1.0计算的。

我正试图在测试器中对不同的货币对在不同的模拟账户上进行检查。

1.1.0的计算是正确的,见calc_profi101.png。

2.函数的 第二次和任何后续调用 返回的利润结果是基于1.0的成交量,成交量的值被忽略了,请看一个截图(calc_profit02.png)--传递了成交量0.5,但结果还是和1.0的一样

你能告诉我问题可能是什么吗?谢谢

我认为答案就在帮助中。

"...利润

[out] 如果函数成功,该变量将保存计算出的利润值。利润估计值取决于许多因素,并可能随着市场环境的变化而变化。"


补充:虽然这只是一个猜测。

 
aveshoff:

你好,我的系统函数OrderCalcProfit有一个奇怪的行为,我感觉在计算中忽略了体积参数,即利润总是按体积1.0计算。

我正试图在测试器中对不同的货币对在不同的模拟账户上进行检查。

1.1.0的计算是正确的,见calc_profi101.png。

2.函数的 第二次和任何后续调用 返回的利润结果是基于1.0的成交量,成交量的值被忽略了,请看一个截图(calc_profit02.png)--传递了成交量0.5,但结果还是和1.0的一样

你能告诉我问题可能是什么吗?谢谢

这是测试的考官--一切工作正常。

//+------------------------------------------------------------------+
//|                                             OrderProfitCheck.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\AccountInfo.mqh>
CAccountInfo      m_account;                    // object of CAccountInfo class
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   string symbol=Symbol();
   ENUM_ORDER_TYPE trade_operation=ORDER_TYPE_BUY;
   double volume=1.0;
   double price_open=1.09350;
   double price_close=1.0930;
   double profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print("Volume 1.0, profit -> ",DoubleToString(profit,2));
   volume=0.5;
   profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print("Volume 0.5, profit -> ",DoubleToString(profit,2));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+

和结果。

2019.09.30 07:47:21.688 OrderProfitCheck (EURUSD,H1)    Volume 1.0, profit -> -50.00
2019.09.30 07:47:21.688 OrderProfitCheck (EURUSD,H1)    Volume 0.5, profit -> -25.00
附加的文件:
 
你能告诉我。是否有可能,如何以编程方式知道所使用的终端的语言?
 
Uladzimir Izerski:
你能不能给我一个提示。这是否可能,我怎样才能以编程方式找出正在使用的终端的语言?

我确定这要么是俄罗斯的终端语言,要么是另一种语言--输出 是英语的。

   if(InpTrailingStop!=0 && InpTrailingStep==0)
     {
      string err_text=(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")?
                      "Трейлинг невозможен: параметр \"Trailing Step\" равен нулю!":
                      "Trailing is not possible: parameter \"Trailing Step\" is zero!";
      //--- when testing, we will only output to the log about incorrect input parameters
      if(MQLInfoInteger(MQL_TESTER))
        {
         Print(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_FAILED);
        }
      else // if the Expert Advisor is run on the chart, tell the user about the error
        {
         Alert(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_PARAMETERS_INCORRECT);
        }
     }


补充:我以为我从TERMINAL_LANGUAGE枚举中保存了所有语言 - 但找不到了。必须失去...

 
大家下午好,谁能帮忙在这里补充一下,在SL就不只是翻转了,还可以增加很多或更多。而当TP被触发时,它将回退1手。
input double   Lot=1;
input int      TakeProfit = 6;
input int      Stoploss   = 6;

int TP;
int SL;

CTrade trader;
bool Invertor;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   TP = TakeProfit;
   SL = Stoploss;

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   double points;

   if(!PositionSelect(_Symbol))
     {
      if(Invertor)
         trader.Buy(Lot);
      else trader.Sell(Lot);
     }
   else
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         points=(SymbolInfoDouble(_Symbol,SYMBOL_BID)-PositionGetDouble(POSITION_PRICE_OPEN))/_Point;
         if(points>=TP)
           {
            trader.PositionClose(_Symbol);
            Invertor=true;
           }

         if(points<=-SL)
           {
            trader.PositionClose(_Symbol);
            Invertor=false;
           }
        }
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         points=(PositionGetDouble(POSITION_PRICE_OPEN)-SymbolInfoDouble(_Symbol,SYMBOL_ASK))/_Point;
         if(points>=TP)
           {
            trader.PositionClose(_Symbol);
            Invertor=false;
           }
         if(points<=-SL)
           {
            trader.PositionClose(_Symbol);
            Invertor=true;
           }
        }
     }   
  }
 
Andrey990:
大家好,谁能帮忙在这里补充一下,在SL的时候,不光是翻身,还要加很多甚至更多。而当TP被触发时,它将返回一个手。

1.我明确建议不要使用通过字符选择位置的函数。使用一个函数,通过一个列表中的索引来选择一个位置。

2.要知道一个头寸是如何关闭的,必须在OnTradeTransaction中查看ENUM_DEAL_REASON 枚举。

使用ENUM_DEAL_REASON的例子。

止损止盈

如果通过止损平仓--双倍交易量,如果通过止盈--设置最小交易量。为了检测交易是否因止损或止盈的触发而发生,我们使用OnTradeTransaction。从Build 1625开始,有一个不错的枚举ENUM_DEAL_REASON: ENUM_DEAL_REASON 描述DEAL_REASON_SL 因触发止损而进行的操作 DEAL_REASON_TP 因触发获利而进行的操作...可以在OnTradeTransaction中跟踪。换句话说,现在你可以很容易而且最重要的是,可靠地确定这笔交易是获利或止损触发的结果。目前(构建1626),该EA只能进行实时测试--要么在图表上,要么在调试模式下使用真实数据(MetaEditor中的F5)。我还暂时应用了一个变通方法:确定触发的内容:OnTradeTransaction过程中的止盈或止损:如果(deal_symbol==m_symbol...

代码库 | 2017.07.13 07:42 |Vladimir Karputov| EAs | MetaTrader 5

 

是否有可能将账户登录信息输入第三方程序并管理账户,你知道,开仓/平 仓?

还是只能通过安装在账户上的机器人?

 

我正在将指标从MQL4转移到MQL5,关于缓冲区和 "绘图 "的问题。该指标有2个缓冲区和1个情节。

#property indicator_buffers 2
#property indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_CALCULATIONS)。
SetIndexBuffer(1,Array2,INDICATOR_DATA)。


如果第一个缓冲区用于计算等,而第二个缓冲区应该被绘制出来,那么

首先,如果在SetIndexBuffer()函数中已经设置为INDICATOR_CALCULATIONS,是否有必要为第一个缓冲区设置DRAW_NONE?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE)。

第二,如果只画第二个缓冲区,我应该在PlotIndexSetInteger()中设置什么索引而不是问号(

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM)。


第三,如果我使用两个DRAW_HISTOGRAM类型的样式,我可以为每个样式设置颜色,并得到像Volumes指标中那样的直方图,其中绿色和红色的柱子交替出现,但如果我使用DRAW_HISTOGRAM2,我是否也可以为一个柱子设置两种颜色,或者这种样式只设置一种颜色?

 
The_Sheikh:

我正在将指标从MQL4转移到MQL5,关于缓冲区和 "绘图 "的问题。该指标有2个缓冲区和1个情节。

#property indicator_buffers 2
#property indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_CALCULATIONS)。
SetIndexBuffer(1,Array2,INDICATOR_DATA)。


如果第一个缓冲区用于计算等,而第二个缓冲区应该被绘制出来,那么

首先,如果在SetIndexBuffer()函数中已经设置为INDICATOR_CALCULATIONS,是否有必要为第一个缓冲区设置DRAW_NONE?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE)。

第二,如果只画第二个缓冲区,我应该在PlotIndexSetInteger()中设置什么索引而不是问号(

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM)。


第三,如果我使用两个DRAW_HISTOGRAM类型的样式,我可以为每个样式设置颜色,并得到像Volumes指标中那样的直方图,其中绿色和红色的柱子交替出现,但如果我使用DRAW_HISTOGRAM2,我是否也可以为一个柱子设置两种颜色,或者这种样式只设置一种颜色?

你为什么对自己如此苛刻?先设置你想显示的缓冲区,然后再设置辅助缓冲区,有什么问题吗?

对于DRAW_HISTOGRAМ2,定义了3个缓冲区,其顺序是强制性的,首先是2个值缓冲区,然后是一个颜色缓冲区。但是DRAW_HISTOGRAM和DRAW_HISTOGRAM2之间有区别,DRAW_HISTOGRAM是从零到缓冲区中的值绘制的,而DRAW_HISTOGRAM2是从一个 缓冲区的值到另一个缓冲区的值。