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

 

如何使位置量达到0(零)?(FORTS, Otkrytie-Broker, Real)

我们有以下代码。

#property strict
long     gTicks=0;
int      Step=0;
//=====
void OnTick()
{
   gTicks++;
   PositionSelect(_Symbol);
   //-----
   {if((gTicks>1000)&&(Step==0))
   {
      Print("OPEN>> *** VOLUME=",PositionGetDouble(POSITION_VOLUME),
                        " *** ID=",PositionGetInteger(POSITION_IDENTIFIER),
                        " *** TYPE=",EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),
                        " *** OrdersTotal()=",OrdersTotal());
      MqlTradeRequest request={0};                                   //Обнулим записи запроса
      MqlTradeResult result={0};                                     //Обнулим записи ответа
      request.action=TRADE_ACTION_PENDING;                           //Отложенный ордер
      request.symbol=_Symbol;                                        //Инструмент
      request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);            //Прайс (цена) исполнения ордера
      request.type=ORDER_TYPE_SELL_STOP;                             //Тип ордера
      request.type_filling=ORDER_FILLING_RETURN;                     //Разрешить исполнять частями (ORDER_FILLING_RETURN)
      request.type_time=ORDER_TIME_SPECIFIED_DAY;                    //В очереди до экспирации
      request.expiration=
         (datetime)SymbolInfoInteger(_Symbol,SYMBOL_EXPIRATION_TIME);//Время истечения фьючерсного контракта
      request.volume=1;                                              //Объем
      Print("OPEN OrderSend=",OrderSend(request,result));
      Print("OPEN Retcode=",result.retcode);
      Print("OPEN Order=",result.order);
      Print("OPEN Deal=",result.deal);
      Print("OPEN OrdersTotal()=",OrdersTotal());
      Print("OPEN Volume=",PositionGetDouble(POSITION_VOLUME));
      Step=1;
      return;
   }}//if((gTicks>1000)&&(Step==0))
   //-----
   {if((gTicks>2000)&&(Step==1))
   {
   Print("CLOSE>> *** VOLUME=",PositionGetDouble(POSITION_VOLUME),
                     " *** ID=",PositionGetInteger(POSITION_IDENTIFIER),
                     " *** TYPE=",EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),
                     " *** OrdersTotal()=",OrdersTotal());
      MqlTradeRequest request={0};                                   //Обнулим записи запроса
      MqlTradeResult result={0};                                     //Обнулим записи ответа
      request.action=TRADE_ACTION_DEAL;                              //Отложенный ордер
      request.symbol=_Symbol;                                        //Инструмент
      request.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);            //Прайс (цена) исполнения ордера
      request.type=ORDER_TYPE_BUY;                                   //тип ордера
      request.type_filling=ORDER_FILLING_FOK;                        //Исполнять только в полном объёме
      request.type_time=ORDER_TIME_DAY;                              //В очереди до снятия
      request.volume=1;                                              //Объем Правильно
      Print("CLOSE OrderSend=",OrderSend(request,result));
      Print("CLOSE Retcode=",result.retcode);
      Print("CLOSE Order=",result.order);
      Print("CLOSE Deal=",result.deal);
      Print("CLOSE OrdersTotal()=",OrdersTotal());
      Print("CLOSE Volume=",PositionGetDouble(POSITION_VOLUME));
      Step=2;
      return;
   }}//if((gTicks>2000)&&(Step==1))        
   //-----   
   {if((gTicks>3000)&&(Step==2))
   {
      Print("INFO>> *** VOLUME=",PositionGetDouble(POSITION_VOLUME),
                        " *** ID=",PositionGetInteger(POSITION_IDENTIFIER),
                        " *** TYPE=",EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),
                        " *** OrdersTotal()=",OrdersTotal());
      Step=3;
      return;
   }}//if((gTicks>3000)&&(Step==2))
   {if((gTicks>4000)&&(Step==3))
   {
      ExpertRemove();
   }}//if((gTicks>4000)&&(Step==3))
}//OnTick()

也就是说,我们 用一个订单开仓,用一个反向订单平仓,然后看一下结果的仓位量。

我们期望0(零),有1(一)。下面的日志(从下面开始)。

2015.10.27 16:28:11.476 2015.10.26 10:05:08   ExpertRemove() function called
2015.10.27 16:28:11.465 2015.10.26 10:03:14   INFO>> *** VOLUME=1.0 *** ID=2 *** TYPE=POSITION_TYPE_SELL *** OrdersTotal()=0
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE Volume=1.0
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE OrdersTotal()=0
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE Deal=3
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE Order=3
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE Retcode=10009
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE OrderSend=true
2015.10.27 16:28:11.449 2015.10.26 10:01:47   order performed buy 1.00 at 9249 [#3  buy 1.00 SBRF-12.15 at 9249]
2015.10.27 16:28:11.449 2015.10.26 10:01:47   deal performed [#3  buy 1.00 SBRF-12.15 at 9249]
2015.10.27 16:28:11.449 2015.10.26 10:01:47   deal #3  buy 1.00 SBRF-12.15 at 9249 done (based on order #3)
2015.10.27 16:28:11.449 2015.10.26 10:01:47   exchange buy 1.00 SBRF-12.15 at 9249 (9242 / 9249 / 9242)
2015.10.27 16:28:11.449 2015.10.26 10:01:47   CLOSE>> *** VOLUME=1.0 *** ID=2 *** TYPE=POSITION_TYPE_SELL *** OrdersTotal()=0
2015.10.27 16:28:11.422 2015.10.26 10:00:57   order performed sell 1.00 at 9205 [#2  sell stop 1.00 SBRF-12.15 at 9205]
2015.10.27 16:28:11.422 2015.10.26 10:00:57   deal performed [#2  sell 1.00 SBRF-12.15 at 9205]
2015.10.27 16:28:11.422 2015.10.26 10:00:57   deal #2  sell 1.00 SBRF-12.15 at 9205 done (based on order #2)
2015.10.27 16:28:11.422 2015.10.26 10:00:57   order [#2  sell stop 1.00 SBRF-12.15 at 9205] triggered
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN Volume=0.0
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN OrdersTotal()=1
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN Deal=0
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN Order=2
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN Retcode=10009
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN OrderSend=true
2015.10.27 16:28:11.422 2015.10.26 10:00:57   sell stop 1.00 SBRF-12.15 at 9205 (9205 / 9227 / 9205)
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN>> *** VOLUME=0.0 *** ID=0 *** TYPE=POSITION_TYPE_BUY *** OrdersTotal()=0
2015.10.27 16:28:11.344 SBRF-12.15,M1: testing of Experts\Projects\CoinAge5\Helper_v01\mq5\Tst\TST006_Open_Close_Positions_001.ex5 from 2015.10.26 00:00 to 2015.10.27 00:00 started

原因是什么呢?

 
Yury Kirillov:

如何使位置量达到0(零)?(FORTS, Otkrytie-Broker, Real)

我们有以下代码。

也就是说,我们 用一个订单开仓,用一个反向订单平仓,然后看一下结果的仓位量。

我们期望0(零),有1(一)。下面的日志(从下面开始)。

原因是什么呢?

谢谢您的关注!在一个相邻的主题中得到了解释。:-)
 
Alexey Viktorov:
完全正确。当我写这个公式时,我的SL不是由一个预定义的值来定义的,而是作为订单开盘价 和某个水平之间的差异来计算的,所以我不得不把风险金额乘以_Point
那么你应该是除法,而不是乘法。
 

大家好!我无法应对一个问题......请帮助!!有一个带有Martingale(2SS)的专家顾问,我几乎重做了一切--现在它也按趋势打开。有一个区块计算单独关闭订单的累计利润,并被重置为 "0" - 当整个系列被关闭时,特别是第一个开放订单。现在这第一笔订单可能会在任何时候关闭...而积累的利润也就无效了。任务:持有此旗帜(系列开盘),直到此旗帜 "出现 "后所有订单都被关闭。在源代码中,它看起来像这样。

  if(OrderSelect(TicketB[totb-1],SELECT_BY_TICKET)) TimeB=OrderOpenTime();
  if(OrderSelect(TicketS[tots-1],SELECT_BY_TICKET)) TimeS=OrderOpenTime();
.......//...........//...........//............//............//........
         if(!OrderSelect(k,SELECT_BY_POS,MODE_HISTORY)) break;
         if((OrderOpenTime()<TimeB || totb==0) && (OrderOpenTime()<TimeS || tots==0)) break;
         if(OrderSymbol()==Symbol())
           {
            if((OrderMagicNumber()==magicbuy || OrderMagicNumber()==magicbuyTrEnd) && OrderType()==OP_BUY  && OrderOpenTime()>TimeB) ProfitBuyN  += OrderProfit()+OrderSwap()+OrderCommission();
            if((OrderMagicNumber()==magicsell || OrderMagicNumber()==magicsellTrEnd) && OrderType()==OP_SELL && OrderOpenTime()>TimeS) ProfitSellN += OrderProfit()+OrderSwap()+OrderCommission();
           }

提前感谢您!

 
Artyom Trishkin:
然后是除法,而不是乘法。
你没有仔细看我的变体,我没有乘以止损,虽然这的确是正确的变体,但我乘以了资金,5-6年后,这似乎是不合理的,但结果是正确的。这些年来,我一直没有回到这个变体,我几乎没有找到一个专家顾问是这样做的。当我发现它时,你已经写了两篇文章了:))
 
Alexey Viktorov:
你没有仔细看我的变体,我没有乘以止损,虽然这确实是正确的变体,而且乘以资金,5-6年后似乎不合理,但结果是正确的。这些年来,我一直没有回到这个变体,我几乎没有找到一个专家顾问是这样做的。当我发现它时,你已经写了两篇文章了:))

而且是来自智能手机;)

当然,这很奇怪。如果我用点来写止损值,就是300(在他的例子中)。因此,在五位数的报价中,止损值为300*0.00001=0.003。

好的。如果必要的收盘价 和开盘价之间的差额等于0.003(在价格上),为什么他乘以0.00000003点?如果他把它分了,他就会得到300,因为他应该得到。

事实上,我是从我的智能手机上回答的,甚至没有意识到我在回答你而不是原来的提问者;)

 
Artyom Trishkin:

而且是来自智能手机;)

当然,这很奇怪。如果我用点来写止损值,就是300(在他的例子中)。因此,在五位数的报价中,止损值为300*0.00001=0.003。

好的。如果必要的收盘价 和开盘价之间的差额等于0.003(在价格上),为什么他乘以0.00000003点?如果他把它分了,他就会得到300个,因为它应该是这样的。

事实上,我是用我的智能手机回答的,一开始甚至没有意识到我是在回答你,而不是回答提问者;)

而现在我已经吃过晚饭了,我不在乎他得到什么。:)))

最主要的是,我们相互理解......:)))))))))))))))))))

 
Alexey Viktorov:

而现在我已经吃过饭了,我不在乎他得到什么。:)))

重要的是,你和我都能理解对方...:)))))))))))))))))))

我很高兴你们能相互理解))。我这个人很年轻,不知道该怎么分,怎么乘。请帮我提供信息,我很高兴能有文章的链接,在我的手指上有一个简单的解释,我很感谢任何帮助。
 
Alexey Viktorov:

现在我已经吃过饭了,我不关心他得到什么。:)))

最主要的是,你和我都能理解对方...:)))))))))))))))))))

我想我已经得到了它,先生们)))。

double Test=100/(300*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE))。

这就是它的作用,谢谢大家)

 
PabloEs:

我想我已经得到了它,先生们))。

double Test=100/(300*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE))。

这就是它的作用,谢谢大家)

看,我吃了晚饭,而你在11分钟内就完成了。:)))