초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 463

 

위치 볼륨이 0(영)이 되도록 하는 방법은 무엇입니까? (FORTS, Otkritie-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(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, Otkritie-Broker, Real)

다음 코드가 있습니다.

즉, 주문 으로 포지션을 열고 역순으로 청산하고 결과적으로 포지션 볼륨을 봅니다.

예상되는 0(영), 1(1)이 있습니다. 아래의 로그(하단에서 시작).

이유는 무엇입니까?

관심을 가져주셔서 감사합니다! 다음 분기에서 설명을 받았습니다. :-)
 
Alexey Viktorov :
맞아요. 이 공식을 작성할 때 내 SL은 주어진 값에 의해 결정되는 것이 아니라 주문 개시 가격 과 일정 수준의 차이로 간주되어 위험 금액에 _Point를 곱해야 했습니다.
그러면 곱하지 말고 나누어야 합니다.
 

모두들 안녕! 한 가지 문제에 대처할 수 없습니다... 도와주세요!!! Martingale(2SS)에는 Expert Advisor가 있었고 거의 모든 것을 완전히 다시 수정했습니다. 이제 Trend에 따라 열립니다. 개별적으로 마감된 주문의 누적 이익을 계산하고 전체 시리즈가 마감되었을 때, 특히 1차 오픈 주문이 "0"으로 재설정된 블록이 있습니다. 이제 이 1차 주문은 언제든지 마감될 수 있으며... 누적 이익은 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 년 후에 이미 불합리해 보이지만 결과는 정확합니다. 그리고 나는 몇 년 동안 이것으로 돌아가지 않았고, 이것이 수행된 Expert Advisor를 거의 찾을 수 없었습니다. 내가 그것을 찾았을 때 당신은 이미 두 개의 게시물을 작성했습니다 :)))
 
Alexey Viktorov :
당신은 내 버전을주의 깊게 보지 않았고 곱하기를 멈추지 않았습니다. 실제로 올바른 옵션이기도하지만 5-6 년 후에 이미 불합리해 보이지만 결과는 정확합니다. 그리고 나는 몇 년 동안 이것으로 돌아가지 않았고, 이것이 수행된 Expert Advisor를 거의 찾을 수 없었습니다. 내가 그것을 찾았을 때 당신은 이미 두 개의 게시물을 작성했습니다 :)))

그리고 스마트폰에서 ;)

일반적으로 당연히 이상합니다. 내가 정지 값을 포인트로 적었다면 300입니다(그의 예에서). 그는 그것을 _Point로 곱했고, 결과적으로 다섯 자리 따옴표로 포인트의 중지 값은 300*0.00001=0.003이 되었습니다.

좋은. 원하는 종가 와 시가의 차이가 0.003(가격 기준)이면 왜 곱해서 0.00000003포인트를 얻었습니까? 나누었으면 300은 받았을텐데.

일반적으로 나는 처음에 질문자가 아니라 내가 이미 당신에게 대답하고 있다는 것을 깨닫지도 않고 스마트 폰에서 대답했습니다.)

 
Artyom Trishkin :

그리고 스마트폰에서 ;)

일반적으로 당연히 이상합니다. 내가 정지 값을 포인트로 적었다면 300입니다(그의 예에서). 그는 그것을 _Point로 곱했고, 결과적으로 다섯 자리 따옴표로 포인트의 중지 값은 300*0.00001=0.003이 되었습니다.

좋은. 그가 요구하는 종가 와 시작가의 차이가 0.003(가격)이라면 왜 곱해서 0.00000003 포인트를 얻습니다. 나누었으면 300은 받았을텐데.

일반적으로 나는 처음에 질문자가 아니라 내가 이미 당신에게 대답하고 있다는 것을 깨닫지도 않고 스마트 폰에서 대답했습니다.)

그리고 이제 나는 이미 저녁을 먹었고 그가 무엇을 하든 상관하지 않습니다. :)))

가장 중요한 것은 우리가 서로를 이해한다는 것입니다 ... :))))))))))))))))))))

 
Alexey Viktorov :

그리고 이제 나는 이미 저녁을 먹었고 그가 무엇을 하든 상관하지 않습니다. :)))

가장 중요한 것은 우리가 서로를 이해한다는 것입니다 ... :))))))))))))))))))))

나는 당신이 서로를 이해하게되어 매우 기쁩니다)) 그리고 아직 아주 어린 나에게는 무엇을 나누고 곱해야하는지 명확하지 않습니다. 정보를 도와주세요. 기사에 대한 링크, 손가락에 대한 간단한 설명, 도움을 주시면 감사하겠습니다.
 
Alexey Viktorov :

그리고 이제 나는 이미 저녁을 먹었고 그가 무엇을 하든 상관하지 않습니다. :)))

가장 중요한 것은 우리가 서로를 이해한다는 것입니다 ... :))))))))))))))))))))

받으신 것 같습니다 여러분 :)

이중 테스트=100/(300*SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE ));

그것이 작동하는 방식입니다. 모두 감사합니다.)

 
PabloEs :

받으신 것 같습니다 여러분 :)

이중 테스트=100/(300*SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE ));

그것이 작동하는 방식입니다. 모두 감사합니다.)

나는 저녁을 먹었고 당신은 11분 만에 해냈습니다. :)))
사유: