Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 462

 
PabloEs:

Помогите сообразить.

Ситуация такая - например нужно открыть позицию по паре EURUSD со стопом 30 пунктов и тейкпрофитом 30 пунктов, перед открытием нужно определить объем лота так чтобы при убыточной сделке был убыток в 100 USD. Как это можно посчитать средствами MQL5?

SL=30; 

 Lot=Формула расчета 

Заранее благодарен. 

Для четвёрки можно так посчитать:

Лот=Деньги / (Стоплос_в_пунктах*MarketInfo(Symbol(),MODE_TICKVALUE))

 
Artyom Trishkin:

Для четвёрки можно так посчитать:

Лот=Деньги / (Стоплос_в_пунктах*MarketInfo(Symbol(),MODE_TICKVALUE))

Спасибо, но мне не помогло.
 
PabloEs:
Спасибо, но мне не помогло.

Смотрите не MarketInfo(), а SymbolInfoDouble()

И что значит "не помогло"? Я ж не рыбу давал, а удочку.

 
Artyom Trishkin:

Смотрите не MarketInfo(), а SymbolInfoDouble()

И что значит "не помогло"? Я ж не рыбу давал, а удочку.

Я еще слишком молод для использования удочки)

Вот написал скрипт по приведенной формуле выше

void OnStart()

  {

//---

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

Alert(Test); 

 Выдает 33333.33, может блесна не та?

 
PabloEs:

Я еще слишком молод для использования удочки)

Вот написал скрипт по приведенной формуле выше

void OnStart()

  {

//---

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

Alert(Test); 

 Выдает 33333.33, может блесна не та?

Деньги / (Стоплос_в_пунктах*MarketInfo(Symbol(),MODE_TICKVALUE))

А вы его в цене считаете

 
PabloEs:

Я еще слишком молод для использования удочки)

Вот написал скрипт по приведенной формуле выше

void OnStart()

  {

//---

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

Alert(Test); 

 Выдает 33333.33, может блесна не та?

Когда-то я писал такую формулу

Lot = AccountFreeMargin()*Risk/100*_Point/(StopLoss*MarketInfo(Symbol(), MODE_TICKVALUE))

AccountFreeMargin()*Risk/100 --- это твои $100

StopLoss --- разница цен открытия ордера и СЛ (не в пунктах)

Соответственно MarketInfo() надо заменить на SymbolInfoDouble()

 
PabloEs:

Я еще слишком молод для использования удочки)

Вот написал скрипт по приведенной формуле выше

void OnStart()

  {

//---

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

Alert(Test); 

 Выдает 33333.33, может блесна не та?

Смотрите что у вас, если по-русски и при _Point, равном 0.00001:

Чтобы заработать 100 долларов при тейке в 0.003 пункта (300*0.00001), лот должен быть 33333.33. Так что блесна точно не та ;)

 
Artyom Trishkin:

Деньги / (Стоплос_в_пунктах*MarketInfo(Symbol(),MODE_TICKVALUE))

А вы его в цене считаете

Совершенно верно. Когда я эту формулу писал у меня СЛ не определялся заданным значением, а считался как разница цены открытия ордера и неким уровнем, потому и пришлось сумму риска умножить на _Point
 

Как добиться, чтобы объём позиции стал равным 0 (нулю)? (ФОРТС, Открытие-Брокер, Реал)

Есть следующий код:

#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 (нулю)? (ФОРТС, Открытие-Брокер, Реал)

Есть следующий код:

То есть открываем позицию ордером, закрываем ее обратным ордером, смотрим объем позиции в результате.

Ожидается 0 (ноль), имеем 1 (один). Логи ниже (начало внизу).

 

 

В чем причина? 

Спасибо за внимание! Получил разъяснения в соседней ветке. :-)