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

 
MT5에서 실제 틱으로 테스트할 때 수수료가 고려됩니까, 아니면 그냥 스프레드인가요?
 

사이클의 다중 통화 전문가 는 기호로 데이터를 요청합니다. 다음 스니펫이 있습니다.

       int gtc1 = GetTickCount ();
      res_copy_buf = CopyBuffer (handle, 0 , 0 , bars_calc, Buf_01); 
       int gtc2 = GetTickCount ();

모든 캐릭터가 잘 작동합니다. 첫 번째 패스 동안 시간은 약 120ms입니다. 표시기 버퍼가 채워지고 있습니다. 두 번째 패스부터 현재 막대의 계산 시간은 1ms 미만입니다.

특이한 점은 잘 알려진 한 브로커에 데이터가 없는 EURRUR 기호가 있다는 것입니다 ("업데이트 대기"). 따라서 계산은 51초 동안 해당 라인에 고정됩니다. 오류 4806. 51초는 사이클은 물론이고 한 번(처음)이라도 허용되지 않습니다.

문제. 주어진 캐릭터에 대한 데이터가 없다는 사실을 빠르게 찾는 방법은 무엇입니까? 그런 다음 나는 그것을 기억하고 다음 반복에서 단순히 그것을 건너 뛰고 속도를 잃지 않고 계속 나아갈 것입니다.

 

동료 - double 유형 의 배열을 문자열로 변환하는 방법을 알려주세요. 파일에 써야 합니다. 다음은 일반 교육 코드입니다.

 void OnStart ()
{

double ar[];               // Массив
ArrayResize (ar, 2 );         // Подготовка массива
int i, Size= ArraySize (ar); // стартовое количество элементов

ar[ 0 ]= 1 ;                   // Установка значений 2-х элементов массива
ar[ 1 ]= 2 ; 

ArrayResize (ar, 3 ); // Увеличение размера массива
ar[ 2 ]= 3 ;           // Установка значения новому элементу массива
ArrayResize (ar, 4 ); // Увеличение размера массива
ar[ 3 ]= 4 ;           // Установка значения новому элементу массива
ArrayResize (ar, 5 ); // Увеличение размера массива
ar[ 4 ]= 5 ;           // Установка значения новому элементу массива
ArrayResize (ar, 6 ); // Увеличение размера массива
ar[ 5 ]= 6 ;           // Установка значения новому элементу массив
ArrayResize (ar, 7 ); // Увеличение размера массива
ar[ 6 ]= 7 ;           // Установка значения новому элементу массив
Size= ArraySize (ar); // новое количество элементов
ArraySetAsSeries (ar, true ); // Смена направления индексации


//--- запись в файл


SaveArrayToFile ( "s_ar" , ar);
return ;
}


bool SaveArrayToFile( string FileName, string   &Array[])
  {
//--- Открытие файла
   int h= FileOpen (FileName, FILE_WRITE | FILE_ANSI | FILE_TXT );
   if (h==- 1 ){ Alert ( " ошибка открытия файла в ф-ии " ); return ( false );} // Ошибка открытия файла
   
//--- Запись в файл
   FileWriteInteger (h, ArraySize (Array), INT_VALUE ); // Запись размера массива
   FileWriteArray (h,Array); // Запись массива
//--- Закрытие файла
   FileClose (h);
   return ( true ); // Сохранение выполнено
 

기사 에서 가져온 정보

파일에서 배열 저장 및 로드

파일에서 배열을 저장하고 로드할 때 첫 번째 차원에 따른 배열 크기 값과 배열 요소의 총 수의 차이를 고려해야 합니다. 배열을 저장할 때 먼저 배열의 크기(ArraySize() 함수에 의해 결정된 총 요소 수)를 파일에 쓴 다음 전체 배열:

 bool SaveArrayToFile( string FileName, string &Array[])
  {
//--- Открытие файла
   int h= FileOpen (FileName, FILE_TXT | FILE_WRITE );
   if (h==- 1 ) return ( false ); // Ошибка открытия файла
//--- Запись в файл
   FileWriteInteger (h, ArraySize (Array),INT_VALUE); // Запись размера массива
   FileWriteArray (h,Array); // Запись массива
//--- Закрытие файла
   FileClose (h);
   return ( true ); // Сохранение выполнено
  }
 

안녕하세요, 나는이 문제에 부딪쳤습니다.

하나의 악기에 대해 서로 다른 마법을 가진 두 명의 고문이 있습니다. 나는 CTrade를 통해 마법을 설정하고 CTrade를 통해 각각 포지션을 엽니다. 첫 번째 어드바이저의 포지션이 open 일 때, 그 매직은 두 번째 어드바이저에게 할당된다(포지션을 연 후 체크 설정, 아래 참조), 그래서 열린 포지션에 대한 체크는 그 매직을 보지 않고, 더 많은 포지션을 한 방향으로 열어준다. . 계정은 데모에 있으며 테스터에서 이를 감지할 수 없습니다. 매직 값이 클래스에 저장되어 있으면 재설정해야 할 수도 있지만 방법을 모르겠습니다.

 int OnInit ()
  {    
   // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
   return ( INIT_SUCCEEDED );
}
открываю позицию соответственно тоже через CTrade:
 if (SellCount()> 0 || BuyCount()> 0 )
           {
             Print ( "Уже есть позиция на продажу !!!" );
             return ; // не добавлять к открытой позиции на покупку
           }
         SL= NormalizeDouble (latest_price.bid + STP* _Point , _Digits );
         TP= NormalizeDouble (latest_price.bid - TKP* _Point , _Digits );
         
         m_trade.Sell(lots1, _Symbol , 0 ,SL,TP, "LaquerreOSC_MA_2.5.6.7 + 2" );
         m_position.Select( _Symbol );
           {
             ulong myMagic=m_position.Magic();
             Print ( " Открыта поза Селл с магиком № " ,myMagic, ", И спредом " , SymbolInfoInteger ( _Symbol , SYMBOL_SPREAD ));
           }
//+------------------------------------------------------------------+
int SellCount() //проверка рыночных ордеров на продажу
  {
   int count= 0 ;
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ;i--)
     {
       if ( PositionSelect ( _Symbol )== true )
        {
         if ( PositionGetInteger ( POSITION_MAGIC )==Magic && PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
            count++;
        }
     }
   return (count);
  }
//+------------------------------------------------------------------+

 
Pavel Nikiforov :

안녕하세요, 나는이 문제에 부딪쳤습니다.

하나의 악기에 대해 서로 다른 마법을 가진 두 명의 고문이 있습니다. 나는 CTrade를 통해 마법을 설정하고 CTrade를 통해 각각 포지션을 엽니다. 첫 번째 어드바이저의 포지션이 open 일 때, 그 매직은 두 번째 어드바이저에게 할당된다(포지션을 연 후 체크 설정, 아래 참조), 그래서 열린 포지션에 대한 체크는 그 매직을 보지 않고, 더 많은 포지션을 한 방향으로 열어준다. . 계정은 데모에 있으며 테스터에서 이를 감지할 수 없습니다. 매직 값이 클래스에 저장되어 있으면 재설정해야 할 수도 있지만 방법을 모르겠습니다.

한 장의 텍스트가 아닌 코드를 올바르게 붙여넣으십시오 .


코드별: 각 어드바이저의 입력 매개변수에서 자신만의 마법을 설정합니다. 10001을 첫 번째로 설정한 다음 10002를 두 번째로 설정했다고 가정해 보겠습니다.

 
Vladimir Karputov :

한 장의 텍스트가 아닌 코드를 올바르게 붙여넣으십시오 .


코드별: 각 어드바이저의 입력 매개변수에서 자신만의 마법을 설정합니다. 10001을 첫 번째로 설정한 다음 10002를 두 번째로 설정했다고 가정해 보겠습니다.

빠른 응답에 감사합니다. 그러나 문제의 사실은 마술사들이 다르다는 것입니다. 따라서 두 번째 로봇의 위치가 첫 번째 로봇의 마법으로 열리는 것으로 판명되었습니다. 어떻게 되는지, 퍼스트 어드바이저의 매직넘버가 어디에 저장되는지는 모르겠지만, 알아내고 싶습니다.

 
Pavel Nikiforov :

빠른 응답에 감사합니다. 그러나 문제의 사실은 마술사들이 다르다는 것입니다. 따라서 두 번째 로봇의 위치가 첫 번째 로봇의 마법으로 열리는 것으로 판명되었습니다. 어떻게 되는지, 퍼스트 어드바이저의 매직넘버가 어디에 저장되는지는 모르겠지만, 알아내고 싶습니다.

이 경우 마법을 설정하는 것이 좋습니다.

   // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
OnInit가 아니라 각 위치/주문 개시 전에.
 
Alexey Viktorov :

이 경우 마법을 설정하는 것이 좋습니다.

OnInit가 아니라 각 위치/주문 개시 전에.

이 경우 "더 나은" 것은 아니지만 정확히 필요한 것입니다. 이것은 표준 거래 기능을 위한 래퍼 클래스입니다. 여러 마법을 저장하지 않습니다. 따라서 그는 새로운 마법으로 포지션을 열어야 할 때와 그 이전에 매번 마법을 설정해야 합니다.

일반적으로 순서는 다음과 같습니다.

  • 매직 1로 포지션을 열어야 합니다 - 매직 1을 설정하세요. 이후 포지션은 매직 1이 될 것입니다.
  • 매직 2로 포지션을 열어야 합니다 - 매직 2를 설정하세요. 이후 포지션은 매직 2가 될 것입니다.
  • 매직 3으로 포지션을 열어야 합니다 - 매직 3을 설정하고 후속 포지션은 매직 3을 갖게 됩니다.

등. ...

 
Alexey Viktorov :

이 경우 마법을 설정하는 것이 좋습니다.

OnInit가 아니라 각 위치/주문 개시 전에.

처음에는 그런 식으로 도움이되지 않습니다. 그러나 예제에서는 일반적으로 OnInit에 서 있으므로 이동했습니다. 오랜만에 이것저것 만지작거리다가 시험에 부엉이가 있고 모든 것이 순조롭게 진행되는 것 같은데 갑자기 서버를 열면 한 방향으로 20개의 위치가 있습니다. 공석 확인이 수업을 통하지 않는다는 사실에 영향을 받을 수 있습니까?

 
Pavel Nikiforov :

빠른 응답에 감사합니다. 그러나 문제의 사실은 마술사들이 다르다는 것입니다. 따라서 두 번째 로봇의 위치가 첫 번째 로봇의 마법으로 열리는 것으로 판명되었습니다. 어떻게 되는지, 퍼스트 어드바이저의 매직넘버가 어디에 저장되는지는 모르겠지만, 알아내고 싶습니다.

CTrade 클래스에는 Get ExpertMagicNumber 메서드가 없으므로 거래 작업 후에 이 코드를 인쇄하십시오.

 Print ( "Expert name: " , __FILE__ , ", magic: " , IntegerToString (m_trade.RequestMagic());

따라서 두 EA에 서로 다른 마법이 있는지 확인하십시오.

사유: