在MQL5中一起学习和写作 - 页 24

 

这个功能是做什么的,大家都很清楚?

int OpenSell(double volume,int slippage=10,string comment="Open Short EUR/USD (Sell)",int magic0=102406)

{

MqlTradeRequest my_trade;

MqlTradeResult my_trade_result;

my_trade.action=TRADE_ACTION_DEAL。

my_trade.symbol=Symbol()。

my_trade.volume=NormalizeDouble(volume,1)。

my_trade.price=NormalizeDouble(Bid,_Digits)。

my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Digits)。

my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits)。

my_trade.deviation=slippage。

my_trade.type=ORDER_TYPE_SELL。

my_trade.type_filling=ORDER_FILLING_AON。

my_trade.comment=评论。

my_trade.magic=magic。


ResetLastError()。

如果(OrderSend(my_trade,my_trade_result))

{

time_oc=TimeLocal()。

md=0。

Print("操作结果 代码 - ",my_trade_result.retcode)。

}

否则

{

Print("操作结果代码 - ",my_trade_result.retcode)。

Print("Order open error = " ,GetLastError())。

}

return(0);

}

在OnTick()过程中

...

OpenSell(Lots,10, "EUR/USD (Sell)",102406)。

...

在最开始的时候。

double StopLoss=250。

TakeProfit=1400。

外来的双倍Lots = 0.1。

为什么220美元会出现在测试结果中?

<日期> <余额> <股权> <利润率水平

01,01,2010 0 :00:00 10000 10000 0

11,01,2010 2 :57:00 9779,29 9841,92 6827

15,01,2010 16:00:00 9829,8 9941,9 6857

22,01,2010 14:32:00 10124,1 10135,9 7167

26,01,2010 2 :14:00 10048,6 10048,6 0

26,01,2010 4 :06:00 10048,6 10038,4 7099

27,01,2010 21:12:00 10188,5 10188,5 0

29,01,2010 2 :16:00 10188,5 10308 7346

29,01,2010 7 :14:00 10188,5 10277,4 7324

04,02,2010 22:05:00 10418,63 10480,83 7592


如果我错了,请戳我的鼻子。

我不会让你看到整个EA。购买的功能类似于...

我以相反的顺序关闭头寸。

 

好的。我一直在喊着我的头。只是学习语言。如果我冒犯了任何人,我表示歉意。我将努力工作并寻找问题所在。我自己可能已经做了,但我真的想学习如何使用mql5制作好的EA。这是一个非常好的系统,但是。到目前为止,我对它有意见。

虽然我在mql4上有20个专家顾问,没有任何问题。

 
Khomtchenko:
...
最好是给出有关时期的交易记录,而不是这些未知的数字。然后也许会更清楚损失来自哪里。
 

我已经开始一点一点地研究 "文件操作 "部分。你知道是否有任何关于如何在MQL5中处理文件的教程吗?

 

删除具有某种模式的所有订单的正确方法是什么?

我有两个函数用于此,check_orders检查具有某种模式的订单,remove_sl删除它们。

void remove_sl()
     {
      int counter01;
      ulong counter02;
      while(check_orders()==true)
        {
         for(counter01=0; counter01<OrdersTotal(); counter01++)
           {
            counter02=OrderGetTicket(counter01);
            if(OrderGetInteger(ORDER_MAGIC)!=magick)
               continue;
            remove_request.action=TRADE_ACTION_REMOVE; remove_request.order=counter02;
            if(OrderCheck(start_request,check_result)==true)
               OrderSend(start_request,trade_result);
           }
        }
     }



bool check_orders()
     {
      int counter01;
      bool order_exist=false;
      for(counter01=0; counter01<OrdersTotal(); counter01++)
        {
         OrderGetTicket(counter01);
         if(OrderGetInteger(ORDER_MAGIC)==magick)
           {
            order_exist=true;
            break;
           }
        }
      return(order_exist);
 

问题是,在EA的日志中出现了这些线条。

2011.05.11 21:40:19 交易 '726238' : 取消订单失败 #4375237 在0.00000买入0.00[无效请求]
也就是说,向交易服务器发出的删除订单的请求是多余的,而删除的请求已经发出。

 

我想我在平仓和开仓方面遇到了问题。

不知何故,我没有0.1手的头寸,而实际上有好几手。显然,一个符号的位置重叠了,位置的体积就会增长。这是解释上述大停顿值和测试时大差异问题的唯一方法。这意味着我对未平仓交易的存在分析不正确,或对平仓的痕迹分析不正确。

这是我用来确定一个符号是否有未结头寸的程序。

int Total()

{

count=0。

for (i=0; i<=PositionsTotal(); i++)

{

如果(PositionGetSymbol(i)==_Symbol){count++;}。

}

return(count)。

}

当然,该函数要么返回0,要么返回1。

我使用以下条目来开立订单

如果(Total()<1)

{

如果(#对指标进行一些检查#) OpenBuy(Lots,10, "EUR/USD (Buy)",102406)。

If (#some check on indicators#) OpenSell(Lots,10, "EUR/USD (Sell)",102406);

}

我开了买和卖,看起来像。

int OpenSell(double volume,int slippage=10,string comment="Open Short EUR/USD (Sell)" ,int magic0=102406)

{

MqlTradeRequest my_trade;

MqlTradeResult my_trade_result;

my_trade.action=TRADE_ACTION_DEAL。

my_trade.symbol=Symbol()。

my_trade.volume=NormalizeDouble(volume,1)。

my_trade.price=NormalizeDouble(Bid,_Digits)。

my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Digits)。

my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits)。

my_trade.deviation=slippage。

my_trade.type=ORDER_TYPE_SELL。

my_trade.type_filling=ORDER_FILLING_AON。

my_trade.comment=评论。

my_trade.magic=magic。


ResetLastError()。

如果(OrderSend(my_trade,my_trade_result))

{

time_oc=TimeLocal()。

md=0。

Print("操作结果 代码 - ",my_trade_result.retcode)。

}

否则

{

Print("操作结果代码 - ",my_trade_result.retcode)。

Print("Order open error = " ,GetLastError())。

}

return(0);

}

我以同样的方式在主程序中关闭交易。

如果(Total()>0)TryToClose()。

TryToClose是这样的。

int TryToClose()
{
for (i=0; i<=PositionsTotal(); i++)
{
如果(PositionGetSymbol(i)==_Symbol)
{
如果(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)。
如果(#一些指标检查#) OpenSell(Lots,10, "EUR/USD (Sell)",102406)
如果(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
如果(#一些指标检查#) OpenBuy(Lots,10, "EUR/USD (Buy)",102406)。
}
}
return(0);

}

该指标检查,如果应该有一个买入位置,而有一个卖出位置,那么我们就做一个买入。

我犯错误的地方。为什么我的位置被扩大了。

 
Khomtchenko:

通过SRC按钮插入代码

Будет читабельнее
你知道MT4订单和MT5订单之间的区别吗?
 

在mql4中,订单要么是交易,要么是待定。

在mql5中,订单是一种待定交易。入市是一种开仓。当订单被触发时,一个头寸被打开。一个符号只能有一个位置,而我们可以有多少个订单。

Спасибо за подсказку
 

每个人都不停地暗示我是愚蠢的。我可能是个哑巴。好吧,找到我的错误,这样我就可以纠正它们。

 
Khomtchenko:

我都有点蠢蠢欲动的感觉了。我可能很傻。好吧,找到我的错误,这样我就可以纠正它们。

我不是在暗示什么,我只是跑过去问什么是最常见的原因,我不知道你的训练水平。

我在这里呆了很久,对很多人已经形成了看法(每个人都有自己的强项),我还不了解你,所以我不打算暗示什么。


我没有看到战略的大局观。从你通过仓位的事实来看,该策略是多货币的。

但你只规定了一个工具,如果工具是一个,为什么要循环使用这些位置?

如果你知道这个乐器,你不需要翻阅所有的位置来寻找它们,你只需要使用这个功能。

bool  PositionSelect(
   string  symbol     // имя инструмента
   );