OrderSend를 사용하여 MT5에서 올바르게 작동하는 방법 - 페이지 9

 
prostotrader :
https://www.mql5.com/ru/forum/97557/page4#comment_2891988
Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber :

죄송하지만 스크립트를 처리하고 싶은 마음은 없습니다.

추가됨

하지만 탈출구가 있다

OrderrSend() 함수는 동기식이므로 주문을 수신하면

기록이 OnTradeTransaction() 에서 동기화되었는지 확인하십시오.

//+------------------------------------------------------------------+
// Expert TradeTransaction function                                  |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
     switch (trans.type)
     {
       case TRADE_TRANSACTION_ORDER_UPDATE :
         switch (trans.order_state)
           {
             case ORDER_STATE_PLACED :
               if (order_ticket==trans.order)
                 {
                   Print ( __FUNCTION__ , " Order plased done. Ticket = " ,trans.order);
                   if (order_ticket> 0 )
                    {
                     if ( OrderSelect (order_ticket))
                       {
                         //Ордер синхронизирован с историей
                       }
                     else
                       {
                         Print ( __FUNCTION__ , " Order not select! Ticket = " ,trans.order);
                       }
                    }
                   else
                    {
                     Print ( __FUNCTION__ , " Wrong order ticket = " ,trans.order);
                    }
                 }
               break ;
           }
         break ;
     }
  }

그리고 춤은 추지 않는다!

 
prostotrader :

그리고 춤은 추지 않는다!

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

OrderSend를 사용하여 MT5에서 올바르게 작동하는 방법

fxsaber , 2016.11.10 10:00

이것은 스크립트이며 어떤 이벤트도 있을 수 없습니다 . 유일한 탈출구는 바보 수면입니다.

SB를 사용하여 이 스크립트를 다시 작성하면 아무 것도 변경되지 않습니다.

 
fxsaber :
원하는대로 수면 을 왜곡시킬 수 있습니다....
 
prostotrader :
원하는대로 수면을 왜곡시킬 수 있습니다....

그들 자신이 이미 제안한 것과 그 이전에 다른 사람들이 말한 것을 왜 반복합니까?

스레드는 OnTradeTransaction의 가능한 문제에 대한 모든 것을 말합니다. 특히 동시에 여러 고문의 작업에 대해.

사람들은 목발을 만듭니다. 문서를 모르고 기능을 사용하는 방법을 모른다는 의미는 아닙니다.

OnTrade와 OnTradeTransaction은 정확히 그들이 한 일입니다. 그리고 그것이 탄생했을 때 개발자들은 계정에 두 명 이상의 고문과 동시에 작업하는 것이 어리석은 일이라고 믿었습니다.

글쎄, 그들은이 점수에서 틀렸습니다. 누구와도 일어나지 않습니다.

EA에서 다음 함수 를 작성해 보세요.

  1. 나는 = 0.
  2. 기호[i]에서 포지션을 엽니다.
  3. i++ >= 5인 경우 - 종료합니다.
  4. 새 위치에 미끄러짐이 없으면 2단계로 돌아갑니다. 미끄러짐이 있으면 퇴장합니다.
 
fxsaber :

그들 자신이 이미 제안한 것과 그 이전에 다른 사람들이 말한 것을 왜 반복합니까?

스레드는 OnTradeTransaction의 가능한 문제에 대한 모든 것을 말합니다. 특히 동시에 여러 고문의 작업에 대해.

사람들은 목발을 만듭니다. 문서를 모르고 기능을 사용하는 방법을 모른다는 의미는 아닙니다.

OnTrade와 OnTradeTransaction은 정확히 그들이 한 일입니다. 그리고 그것이 탄생했을 때 개발자들은 계정에 두 명 이상의 고문과 동시에 작업하는 것이 어리석은 일이라고 믿었습니다.

글쎄, 그들은이 점수에서 틀렸습니다. 누구와도 일어나지 않습니다.

EA에서 다음 함수 를 작성해 보세요.

  1. 나는 = 0.
  2. 기호[i]에서 포지션을 엽니다.
  3. i++ >= 5인 경우 - 종료합니다.
  4. 새 위치에 미끄러짐이 없으면 2단계로 돌아갑니다. 미끄러짐이 있으면 퇴장합니다.

현재 저는 41명의 Expert Advisors가 실생활에서(하나의 터미널에서) 일하고 있으며, 이는 총 거래일입니다.

2000개 주문을 오픈 포지션과 클로즈 포지션으로 설정했는데 전혀 어려움을 겪지 않았습니다!

추가됨

'그렇게 필요하다'는 것이 아니라 있는 기능부터 진행해야 한다.

개발자는 가능한 경우 희망 사항을 고려하여 오류를 수정하고 단점을 제거합니다.

(매우 느리지만).

OederSend()가 곧 해결될 것 같습니다.

 
prostotrader :

현재 저는 41명의 Expert Advisors가 실생활에서(하나의 터미널에서) 일하고 있으며, 이는 총 거래일입니다.

2000개 주문을 오픈 포지션과 클로즈 포지션으로 설정했는데 전혀 어려움을 겪지 않았습니다!

주제에서 벗어나라고 합니다.

가장 단순한 논리라도

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

OrderSend를 사용하여 MT5에서 올바르게 작동하는 방법

fxsaber , 2016.11.15 13:30

EA에서 다음 함수 를 작성해 보세요.

  1. 나는 = 0.
  2. 기호[i]에서 포지션을 엽니다.
  3. i++ >= 5인 경우 - 종료합니다.
  4. 새 위치에 미끄러짐이 없으면 2단계로 돌아갑니다. 미끄러짐이 있으면 퇴장합니다.
누가 당장 시행해
// MQL4&5-code

#property strict

#include <MT4Orders.mqh>     // https://www.mql5.com/ru/code/16006

void Func( const string &Symbols[] )
{
   const int Total = ArraySize (Symbols);
  
   for ( int i = 0 ; i < Total; i++)
  {
     const double Price = SymbolInfoDouble (Symbols[i], SYMBOL_ASK );
     const int digits = ( int ) SymbolInfoInteger (Symbols[i], SYMBOL_DIGITS );
    
     if (! OrderSelect ( OrderSend (Symbols[i], OP_BUY , 1 , Price, 100 , 0 , 0 , DoubleToString (Price, digits)), SELECT_BY_TICKET ) ||
        ( NormalizeDouble (Price - OrderOpenPrice (), digits) != 0 )) // если не получилось открыть или есть проскальзывание - выходим
       break ;
  }
}

void OnStart () // OnTick
{
   const string Symbols[] = { "EURUSD" , "GBPUSD" , "AUDUSD" , "USDCAD" , "USDJPY" };
  
  Func(Symbols);
}

그리고 누군가는 개발자들의 천상의 마력을 기다리고 있습니다.
 

나는 이미 당신이 원하는 대로 변태할 권리가 있다고 말했습니다(모든 사람이 이 권리를 가집니다).

 
prostotrader :

나는 이미 당신이 원하는 대로 변태할 권리가 있다고 말했습니다(모든 사람이 이 권리를 가집니다).

오래 전 일이지만 이 사람을 기억합니다. 음, 이 사람 - fxsaber 는 놀라운 일을 했습니다.

지금까지 해당 코드는 MT4 코드베이스에 저장되어 있으며 WinInet을 통해 사이트를 읽기 위한 코드입니다.

오늘날까지 많은 프로그래머가 사용...

따라서 그는 변태가 아닌 것 같습니다 ...

 
여기 라이브러리에서 동기화된 OrderSendSync 를 제거했습니다.
uint OrderSend_MaxPause = 1000000 ; // максимальное время на синхронизацию в мкс.

const bool IsTester = (:: MQLInfoInteger ( MQL_TESTER ) || :: MQLInfoInteger ( MQL_OPTIMIZATION ) ||
                       :: MQLInfoInteger ( MQL_VISUAL_MODE ) || :: MQLInfoInteger ( MQL_FRAME_MODE ));
                      
                      

bool Waiting( const bool FlagInit = false )
{
   static ulong StartTime = 0 ;

   if (FlagInit)
    StartTime = :: GetMicrosecondCount ();

   const bool Res = (:: GetMicrosecondCount () - StartTime < OrderSend_MaxPause);

   if (Res)
    :: Sleep ( 0 );

   return (Res);
}

bool EqualPrices( const double Price1, const double Price2, const int digits)
{
   return (:: NormalizeDouble (Price1 - Price2, digits) == 0 );
}

#define WHILE(A) while (!(Res = (A)) && Waiting())

bool OrderSendSync ( const MqlTradeRequest &Request, MqlTradeResult &Result )
{
   bool Res = :: OrderSend (Request, Result);

   if (Res && !IsTester && (Result.retcode < TRADE_RETCODE_ERROR ) && (OrderSend_MaxPause > 0 ))
  {
    Res = (Result.retcode == TRADE_RETCODE_DONE );
    Waiting( true );

     if (Request.action == TRADE_ACTION_DEAL )
    {
      WHILE(:: HistoryOrderSelect (Result.order))
        ;

      Res = Res && ((( ENUM_ORDER_STATE ):: HistoryOrderGetInteger (Result.order, ORDER_STATE ) == ORDER_STATE_FILLED ) ||
                    (( ENUM_ORDER_STATE ):: HistoryOrderGetInteger (Result.order, ORDER_STATE ) == ORDER_STATE_PARTIAL ));

       if (Res)
        WHILE(:: HistoryDealSelect (Result.deal))
          ;
    }
     else if (Request.action == TRADE_ACTION_PENDING )
    {
       if (Res)
        WHILE(:: OrderSelect (Result.order))
          ;
       else
      {
        WHILE(:: HistoryOrderSelect (Result.order))
          ;

        Res = false ;
      }
    }
     else if (Request.action == TRADE_ACTION_SLTP )
    {
       if (Res)
      {
         bool EqualSL = false ;
         bool EqualTP = false ;

         const int digits = ( int ):: SymbolInfoInteger (Request.symbol, SYMBOL_DIGITS );

         if ((Request.position == 0 ) ? :: PositionSelect (Request.symbol) : :: PositionSelectByTicket (Request.position))
        {
          EqualSL = EqualPrices(:: PositionGetDouble ( POSITION_SL ), Request.sl, digits);
          EqualTP = EqualPrices(:: PositionGetDouble ( POSITION_TP ), Request.tp, digits);
        }

        WHILE((EqualSL && EqualTP))
           if ((Request.position == 0 ) ? :: PositionSelect (Request.symbol) : :: PositionSelectByTicket (Request.position))
          {
            EqualSL = EqualPrices(:: PositionGetDouble ( POSITION_SL ), Request.sl, digits);
            EqualTP = EqualPrices(:: PositionGetDouble ( POSITION_TP ), Request.tp, digits);
          }
      }
    }
     else if (Request.action == TRADE_ACTION_MODIFY )
    {
       if (Res)
      {
         bool EqualSL = false ;
         bool EqualTP = false ;

         const int digits = ( int ):: SymbolInfoInteger (Request.symbol, SYMBOL_DIGITS );

         if (:: OrderSelect (Result.order))
        {
          EqualSL = EqualPrices(:: OrderGetDouble ( ORDER_SL ), Request.sl, digits);
          EqualTP = EqualPrices(:: OrderGetDouble ( ORDER_TP ), Request.tp, digits);
        }

        WHILE((EqualSL && EqualTP))
           if (:: OrderSelect (Result.order))
          {
            EqualSL = EqualPrices(:: OrderGetDouble ( ORDER_SL ), Request.sl, digits);
            EqualTP = EqualPrices(:: OrderGetDouble ( ORDER_TP ), Request.tp, digits);
          }
      }
    }
     else if (Request.action == TRADE_ACTION_REMOVE )
       if (Res)
        WHILE(:: HistoryOrderSelect (Result.order))
          ;
  }

   return (Res);
}

#undef WHILE
코드 이면의 아이디어는 명확해야 합니다. 아마도 무언가가 고려되지 않았을 것입니다. 나는 내 작업에서 어떤 오류도 발견하지 못했습니다.
사유: