거래 중 거래 - 페이지 4

 
Andrey Dik :

나는 전에 OnTradeTransaction() 이벤트를 처리한 적이 없었습니다. 거래 로직이 정확히 작동하는 것을 고려할 필요가 없었기 때문에 필요가 없었습니다. SL 또는 TP. 이것이 내 거래 경험의 증거라고 생각하십니까?)))

나는 매우 주의 깊게 읽었지만 누군가가 작동하는 코드의 형태로 이해하기 쉬운 대답을 줄 것이라고 보지 못했습니다. 아니면 빌어먹을 비밀스럽고 위대한 마법, 즉 비밀 지식과 무엇이 효과가 있었는지 결정할 수 있는 능력입니까?

나는 특히 FOREX를 위해 주문 고문을 쓰지 않습니다.

이제 이해하기 쉬운 코드를 작성하는 데 필요한 모든 지식이 있습니다.

귀하의 필요에 적합합니다.

 
prostotrader :

나는 특히 FOREX를 위해 주문 고문을 쓰지 않습니다 .

이제 이해하기 쉬운 코드를 작성하는 데 필요한 모든 지식이 있습니다.

귀하의 필요에 적합합니다.

그리고 누가 주문하기 위해 쓰라고 했습니까?!

오늘 이 포럼에서 질문을 하는 것은 주문하기 위해 작성하는 것을 의미합니까?

네, 여러분 모두 지옥에 가십시오. 허스터즈.

 
Andrey Dik :

...

그리고 계좌 이력에서 마지막 거래에 대한 해설을 보면 그게 맞을까요?

그런 것:

//+------------------------------------------------------------------+
//| Возвращает причину закрытия позиции по Take Profit               |
//+------------------------------------------------------------------+
bool CAccountHistory::IsClosedByTakeProfit( const string symbol)
  {
//--- Получим комментарий последней сделки на указанном символе
   string last_comment=LastDealComment(symbol);
//--- Если в комментарии есть строка "tp"
   if ( StringFind (last_comment, "tp" , 0 )>- 1 )
       return ( true );
//--- Если нет строки "tp"
   return ( false );
  }
//+------------------------------------------------------------------+
//| Возвращает причину закрытия позиции по Stop Loss                 |
//+------------------------------------------------------------------+
bool CAccountHistory::IsClosedByStopLoss( const string symbol)
  {
//--- Получим комментарий последней сделки на указанном символе
   string last_comment=LastDealComment(symbol);
//--- Если в комментарии есть строка "sl"
   if ( StringFind (last_comment, "sl" , 0 )>- 1 )
       return ( true );
//--- Если нет строки "sl"
   return ( false );
  }
//+------------------------------------------------------------------+
//| Возвращает комментарий последней сделки на указанном символе     |
//+------------------------------------------------------------------+
string CAccountHistory::LastDealComment( const string symbol)
  {
   int     total_deals  = 0 ;   // Всего сделок в списке выбранной истории
   string deal_symbol  = "" ; // Символ сделки
   string deal_comment = "" ; // Комментарий сделки
//--- Если история сделок получена
   if ( HistorySelect ( 0 , TimeCurrent ()))
     {
       //--- Получим количество сделок в полученном списке
      total_deals= HistoryDealsTotal ();
       //--- Пройдемся по всем сделкам в полученном списке от последней сделки к первой
       for ( int i=total_deals- 1 ; i>= 0 ; i--)
        {
         //--- Получим комментарий сделки
         deal_comment= HistoryDealGetString ( HistoryDealGetTicket (i), DEAL_COMMENT );
         //--- Получим символ сделки
         deal_symbol= HistoryDealGetString ( HistoryDealGetTicket (i), DEAL_SYMBOL );
         //--- Если символ сделки и текущий символ равны, остановим цикл
         if (deal_symbol==symbol)
             break ;
        }
     }
//---
   return (deal_comment);
  }
 
Anatoli Kazharski :

그리고 계좌 이력에서 마지막 거래에 대한 해설을 보면 그게 맞을까요?

그런 것:

고마워, 친절한 사람!

아마도 이것은 SL과 TP가 미끄러질 수 있고 가격을 비교하는 것은 쓸모가 없을 것이라는 점을 감안할 때 가장 신뢰할 수있는 방법입니다.

 
Anatoli Kazharski :

그리고 계좌 이력에서 마지막 거래에 대한 해설을 보면 그게 맞을까요?

그런 것:


그리고 코멘트가 없다면(완전히 가능합니다)?

 
Andrey Dik :

아마도 이것은 SL과 TP가 미끄러질 수 있고 가격을 비교하는 것은 쓸모가 없을 것이라는 점을 감안할 때 가장 신뢰할 수있는 방법입니다.

아니요, 이 방법은 좋지 않습니다.
   static int GetOrderType( const ulong OrderTicket )
     {
       int OrderType =( int ):: HistoryOrderGetInteger ( OrderTicket , ORDER_TYPE );

       if (( OrderType == ORDER_TYPE_BUY ) || ( OrderType == ORDER_TYPE_SELL ))
        {
         const string OrderComment = HistoryOrderGetString ( OrderTicket , ORDER_COMMENT );
         const string OrderPrice=:: DoubleToString (:: HistoryOrderGetDouble ( OrderTicket , ORDER_PRICE_OPEN ),
                                                  ( int ):: SymbolInfoInteger ( HistoryOrderGetString ( OrderTicket , ORDER_SYMBOL ), SYMBOL_DIGITS ));

         if ( OrderComment == "tp " +OrderPrice)
             OrderType =ORDER_TYPE_TAKEPROFIT;
         else if ( OrderComment == "sl " +OrderPrice)
             OrderType =ORDER_TYPE_STOPLOSS;
        }

       return ( OrderType );
     }
 
prostotrader :

그리고 코멘트가 없다면(완전히 가능합니다)?

물론 충분히 가능합니다. 나는 이것을 가장 간단하고 빠른 테스터의 히스토리 분석에 사용합니다.

따라서 보류 중인 주문 의 경우 티켓을 수행하고 분석해야 합니다. 준비된 예제가 없습니다.

 
오래된 문제

후 MQL5를 사용하여 이익실현 및 손절매 값을 찾을 수 없습니다 .


이것은 근거 없는 비난이 아니라 모든 것이 어떻게 작동하는지 알아내려고(HistorySelectByPosition 등의 도움 없이) 많은 시간을 보낸 결과입니다. 그리고 제가 틀렸다면 기꺼이 사과할 준비가 되어 있습니다. 근거가 없는 말을 하지 않기 위해 RoboForexEU-MetaTrader 5 서버에 테스터를 위한 고문(이해하기 쉬움)을 데려와 포지션을 연 다음 SL 및 TP 수준을 설정합니다.

 void OnTick ()
{
   static bool Flag = true ;

   if (Flag)
  {
     // Открываем SELL-позицию
     MqlTradeRequest Request = { 0 };

    Request.action = TRADE_ACTION_DEAL ;

    Request.symbol = Symbol ();
    Request.volume = 1 ;
    Request.price = SymbolInfoDouble ( Symbol (), SYMBOL_BID );

    Request.type = ORDER_TYPE_SELL ;

     MqlTradeResult Result;

     if ( OrderSend (Request, Result))
    {
       // Устанавливаем SL и TP
      Request.position = Result.deal;

      Request.action = TRADE_ACTION_SLTP ;

      Request.tp = Result.ask - 10 * _Point ;
      Request.sl = Result.ask + 10 * _Point ;

       if ( OrderSend (Request, Result))
         Print ( "Сделка в тестере закроется либо по SL, TP, либо по окончании бэктеста" )    ;

      Flag = false ;
    }
  }
}

이 Expert Advisor에서는 단일 마감 포지션의 SL 및 TP를 (OnDeinit에서) 결정하는 것이 불가능합니다. 그렇게 의도된 것인가?

클로즈드 포지션의 SL TP를 결정할 수 있는 사람은 누구입니까?
 
Anatoli Kazharski :

물론 충분히 가능합니다. 나는 이것을 가장 간단하고 빠른 테스터의 히스토리 분석에 사용합니다.

따라서 보류 중인 주문 의 경우 티켓을 수행하고 분석해야 합니다. 준비된 예제가 없습니다.

이 방법에 무엇이 문제였습니까?

case TRADE_TRANSACTION_DEAL_ADD :
   if (trans.order != my_order_ticket)
  {
   //Сработал SL или TP
  }
break ;
 
prostotrader :

이 방법에 무엇이 문제였습니까?

case TRADE_TRANSACTION_DEAL_ADD :
   if (trans.order != my_order_ticket)
  {
   //Сработал SL или TP
  }
break ;
예, 그런 것입니다. 아직 테스트하지 않았을 뿐입니다.
사유: