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

 
안녕하세요. 초보 거래자 가 임의의 이익실현을 설정할 수 있는 통화 쌍으로 잠금 주문을 열 수 있는 적합한 자동 거래 EA를 찾도록 도와주세요. 고맙습니다.
 
abcxyzabcxyz :
안녕하세요. 초보 거래자가 임의의 이익실현을 설정할 수 있는 통화 쌍으로 잠금 주문을 열 수 있는 적합한 자동 거래 EA를 찾도록 도와주세요. 고맙습니다.
잠금이 정말로 필요하다면 여기 있습니다 . MetaTrader 5 플랫폼은 네팅이므로 MetaTrader 5에는 잠금이 없습니다.
MQL4: форум по механическим торговым системам и тестированию стратегий
  • www.mql5.com
MQL4: форум по механическим торговым системам и тестированию стратегий
 
micle :
옵션으로: 유형 식별자를 반환하는 Type 메서드를 모두 선언합니다.

헉, 소스코드 수정이 가능했다면.. 다 단순화할 필요는 없겠죠. 그러나 여전히 - mql5에 클래스 이름이 있습니까?

 
YAndrey :

헉, 소스코드 수정이 가능했다면.. 다 단순화할 필요는 없겠죠. 그러나 여전히 - mql5에 클래스 이름이 있습니까?

템플릿을 찾으십시오. 이 코드는 클래스 또는 기본 유형의 이름을 반환합니다.

#include <Trade\Trade.mqh>
//+----------------------------------------------- --------------------+
//| |
//+----------------------------------------------- --------------------+
무효의   시작 ()
{
//---
CTrade 무역;
이중 d_value=M_PI;
    정수 i_value=INT_MAX;
    인쇄 ( "d_value: type=" , GetTypeName(d_value), ", value=" , d_value);
    인쇄 ( "i_value: type=" , GetTypeName(i_value), ", value=" , i_value);
    인쇄 ( "trade: type=" ,GetTypeName(trade));
//---
}
//+----------------------------------------------- --------------------+
//| 유형을 문자열로 반환 |
//+----------------------------------------------- --------------------+
템플릿 < typename T>
문자열 GetTypeName( const T & t)
{
//--- 유형을 문자열로 반환
    리턴 ( 유형명 (T));
//---
}

 
C-4 :

템플릿을 찾으십시오. 이 코드는 클래스 또는 기본 유형의 이름을 반환합니다.

#include <Trade\Trade.mqh>
//+----------------------------------------------- --------------------+
//| |
//+----------------------------------------------- --------------------+
무효의   시작 ()
{
//---
CTrade 무역;
이중 d_value=M_PI;
    정수 i_value=INT_MAX;
    인쇄 ( "d_value: type=" , GetTypeName(d_value), ", value=" , d_value);
    인쇄 ( "i_value: type=" , GetTypeName(i_value), ", value=" , i_value);
    인쇄 ( "trade: type=" ,GetTypeName(trade));
//---
}
//+----------------------------------------------- --------------------+
//| 유형을 문자열로 반환 |
//+----------------------------------------------- --------------------+
템플릿 < typename T>
문자열 GetTypeName( const T & t)
{
//--- 유형을 문자열로 반환
    리턴 ( 유형명 (T));
//---
}

에! 내가 뭔가 있어! 그러나 new에서는 작동하지 않습니다. 코드에 내가 필요한 것의 예가 있습니다. 누군가 어떤 방법을 알려줄 수 있습니까?

class a{
public :
virtual void Print (){ Print ( "Print class a" );}
};

class b: public a{
public :
virtual void Print (){ Print ( "Print class b" );}
};

class c: public a{
public :
virtual void Print (){ Print ( "Print class c" );}
void Print2(){ Print ( "!Print2! class c" );}
};


void add(a *&arr[], bool var)
{
   ArrayResize (arr, ArraySize (arr)+ 1 );
   if (var)
      arr[ ArraySize (arr)- 1 ] = new b;
   else
      arr[ ArraySize (arr)- 1 ] = new c;
   
}

void OnStart ()
  {
//--- 
   
   
   a *arr[];

   add(arr, true ); // На самом деле здесь я НЕ знаю, какой класс добавит функция add
   add(arr, false ); // Это потомок класса а или сам класс а, исходный код которого я править не могу.
   for ( int i = 0 ; i < ArraySize (arr); i++)
   {
       // Вот тут то мне и надо узнать, что за класс там
       // шаблон вернет *а, как и объявлено. Но мне надо проверить - можно ли вызвать функцию, которая есть только в с
       if (i == 1 ) // Вот тут должна быть проверка на имя класса
      {
         c *tmp = arr[i];
         tmp.Print2();
      }
    }  
   
   
   
   
   
//--- 
  }
 
YAndrey :

에! 내가 뭔가 있어! 그러나 new에서는 작동하지 않습니다. 코드에 내가 필요한 것의 예가 있습니다. 누군가 어떤 방법을 알려줄 수 있습니까?

이것은 템플릿 메소드 문제입니다. 불행히도 템플릿 메서드는 인스턴스를 참조하는 클래스의 이름을 반환합니다. 인스턴스 자체의 유형은 아직 알 수 없습니다.
 

위의 코드가 테스터에서는 작동하지 않는데 실시간으로 작동하는 이유를 누가 설명해주실 수 있나요!!? 왜 HistoryOrderGetInteger... 속성이 HistorySelect(0, TimeCurrent()) 이후에 테스터에서 사용할 수 없는지 특히 관심이 있습니다.

 #include <Trade\Trade.mqh>

CTrade trade;

int OnInit ()
{
   trade.LogLevel(LOG_LEVEL_NO);
   return INIT_SUCCEEDED ;
}
void OnTick ()
{
   if (!DetectNewBar()) return ;
   trade.Sell( 0.1 );
   HistorySelect ( 0 , TimeCurrent ());
   for (; dealsCount < HistoryDealsTotal (); dealsCount++)
   {
       ulong ticket = HistoryDealGetTicket (dealsCount);
      RecalcDeal(ticket);
   }
}

bool DetectNewBar( void )
{
   MqlRates bars[ 1 ];
   CopyRates ( Symbol (), PERIOD_M1 , 0 , 1 , bars);
   if (bars[ 0 ].time != timeLastBar)
   {
      timeLastBar = bars[ 0 ].time;
       //printf(expertName + " new bar detected: " + TimeToString(bars[0].time));
       return true ;
   }
   return false ;
}

void RecalcDeal( ulong ticketDeal)
{
   //History is selected in OnTick()!
   ulong ticketOrder = HistoryDealGetInteger (ticketDeal, DEAL_ORDER );
   //if(!HistoryOrderSelect(ticketOrder))
   //   printf("order not select.");
   ENUM_ORDER_TYPE type = ( ENUM_ORDER_TYPE ) HistoryOrderGetInteger (ticketOrder, ORDER_TYPE );
   datetime time = HistoryOrderGetInteger (ticketOrder, ORDER_TIME_SETUP ); 
   ulong time_msc = HistoryOrderGetInteger (ticketOrder, ORDER_TIME_SETUP_MSC ); 
   printf ( "Order: " + ( string )ticketOrder + " Type: " + EnumToString (type) + " Time: " + ( string )time +
           " Time msc: " + ( string )time_msc + " Total Orders: " + HistoryOrdersTotal ());
}

int dealsCount;

datetime timeLastBar;

전략 테스터의 스크린샷:

데모의 실시간 스크린샷:

ps 흥미롭게도 테스터의 첫 번째 주문은 올바르게 처리되지만 나머지는 그렇지 않습니다. 그러나 HistroryOrderSelect(ticketOrder)의 주석을 해제하면 실시간으로 주문이 선택되지 않았다는 메시지가 표시되고 반대로 전략 테스터에서는 첫 번째 주문을 제외한 모든 것이 작동하기 시작합니다.

 

그리고 HistorySelect()에 문제가 있습니다. 나는 시장가 주문을 보내 스크립트로 포지션을 오픈하고, 거래가 열리면 스크립트가 런칭된 이후 히스토리에 있는 거래 수를 즉시 살펴보고 초당 10번 간격으로 확인합니다. 물론 하나의 거래여야 합니다. 스크립트는 다음과 같습니다.

 void OnStart ()
{
         // время запуска скрипта
         datetime dtStartTime = TimeCurrent ();
        
         // структуры запроса
         MqlTradeRequest oRequest = { 0 };
         MqlTradeResult oResult = { 0 };
        
         // формируем запрос
        oRequest.action = TRADE_ACTION_DEAL ;
        oRequest.magic  = 15 ;
        oRequest.symbol = _Symbol ;
        oRequest.volume = 0.1 ;
        oRequest.type   = ORDER_TYPE_BUY ;
        oRequest.type_filling = ORDER_FILLING_FOK ;
        oRequest.price  = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
        oRequest.deviation = 1000 ;
        
         // шлём ордер
         bool bResult = OrderSend (oRequest, oResult);
        
         // если позиция успешно открыта
         if (bResult == true && oResult.retcode == 10009 ) // если позиция открыта
        {
                 for ( int i = 0 ; i < 10 ; i++)
                {
                         // запрашиваем историю за время работы скрипта
                         HistorySelect (dtStartTime, TimeCurrent ());
                
                         // количество сделок за время работы скрипта (должна быть одна)
                         Print ( "Шаг: " , i, " Совершено сделок: " , HistoryDealsTotal ());
                        
                         Sleep ( 1000 );
                }
        }
}

Alpha Forex의 결과는 다음과 같습니다.

거래는 실제로 이루어졌고 10초가 지나도 기록에 없습니다. 그것은 무엇입니까? 버그 MT? 글리치 알파? 내가 모르는 기능? Alpari의 경우 동일한 스크립트가 잘 작동합니다. 첫 번째(0) 단계에서 때때로 0을 건너뛰고(이는 이해할 수 있습니다. 기록이 아직 업데이트되지 않음) 다른 모든 단계는 1입니다. 하지만 10초 후, 왜 역사에 거래가 없는 것일까요?

 
Algo :

그리고 HistorySelect()에 문제가 있습니다. 나는 시장가 주문을 보내 스크립트로 포지션을 오픈하고, 거래가 열리면 스크립트가 런칭된 이후 히스토리에 있는 거래 수를 즉시 살펴보고 초당 10번 간격으로 확인합니다. 물론 하나의 거래여야 합니다. 스크립트는 다음과 같습니다.

다음은 Alpha Broker의 결과입니다.

거래는 실제로 이루어졌고 10초가 지나도 기록에 없습니다. 그것은 무엇입니까? 버그 MT? 글리치 알파? 내가 모르는 기능? Alpari의 경우 동일한 스크립트가 잘 작동합니다. 첫 번째(0) 단계에서 때때로 0을 건너뛰고(이는 이해할 수 있습니다. 기록이 아직 업데이트되지 않음) 다른 모든 단계는 1입니다. 하지만 10초 후, 왜 역사에 거래가 없는 것일까요?

스트레인 스트링

날짜 시간 dtStartTime = TimeCurrent();

dtStartTime 과 TimeCurrent() 가 에 대한 시간 기준으로 동일한 숫자가 아닌 것이 확실합니까? 아마도 1초의 반올림은 완료된 거래를 dtStartTime 외부에 두는 것 같습니다.

 
C-4 :

스트레인 스트링

날짜 시간 dtStartTime = TimeCurrent();

dtStartTime 과 TimeCurrent() 가 에 대한 시간 기준으로 동일한 숫자가 아닌 것이 확실합니까? 아마도 1초의 반올림은 완료된 거래를 dtStartTime 외부에 두는 것 같습니다.

그리고 단 한 가지라도, MT는 이 순간에 역사를 말해야 하지 않겠습니까? 저것들. 경계 자체를 포함하여 지정된 경계 내에서 이야기를 제공하지 않습니까?

그러나 어쨌든 dtStartTime = TimeCurrent() - 1 및 dtStartTime = TimeCurrent() - 10을 모두 작성해 보았습니다. 도움이 되지 않습니다.

사유: