다른 기간으로 전환할 때 표시기의 전역 변수, 구조를 전송하는 방법은 무엇입니까? - 페이지 4

 
Nikolai Semko :
개인적으로 유니온을 통해 리소스를 사용합니다.
구조 배열도 파일에 쓰지 않고 TF 간에 쉽게 전송됩니다.

그리고 더 자세하게 가능합니다. 고맙습니다.

 
Mikhail Nazarenko :

그리고 더 자세하게 가능합니다. 고맙습니다.

어떻게든 KB에 적어두겠습니다.
실제로 여기에 클래스가 있습니다.
표시기에 두 줄만 추가하면 됩니다.

  • OnInit 전에 이 클래스의 인스턴스를 만들고 TF 간에 전달할 구조 배열을 바인딩합니다. 이것이 첫 번째 초기화가 아닌 경우 구조 배열은 이전 TF의 데이터로 채워집니다.
  • OnDeinit에서 이 클래스의 유일한 메서드를 통해 배열을 저장합니다.

 template < typename T>
class CStructArr {
 private :
   union StructUint {
      T st;
       uint u[ 1 + sizeof (T)/ 4 ];
   };
   string             Name;
   uint               Var[];
   int                w;
   int                h;
   StructUint        su;
   int                size;

 public :
   CStructArr( const string name,T &var[]);
   ~CStructArr();
   bool               Set(T &var[]);
   //bool              Save();
   T                 value[];
};
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template < typename T>
CStructArr::CStructArr( const string name,T &var[]) {
   //ulong tt=GetMicrosecondCount();
   size = ArraySize (var);
   w= 1 +size* sizeof (T)/ 4 ;
   ArrayResize (Var,w);
   h= 1 ;
   Name= "::" +name+ IntegerToString ( ChartGetInteger ( 0 , CHART_WINDOW_HANDLE ));
   if ( ResourceReadImage (Name,Var,w,h)) {
      size = 4 *(w- 1 )/ sizeof (T);
       ArrayResize (value,size);
       ArrayResize (var,size);
       for ( int j= 0 ; j<size; j++) {
         for ( int i= 0 ; i< sizeof (T)/ 4 ; i++) su.u[i]=Var[j* sizeof (T)/ 4 +i];
         value[j]=su.st;
         var[j]=value[j];
      }
   } else {
       for ( int j= 0 ; j<size; j++) {
         su.st=var[j];
         for ( int i= 0 ; i< sizeof (T)/ 4 ; i++) Var[j* sizeof (T)/ 4 +i]=su.u[i];
         value[j]=var[j];
      }
       if (! ResourceCreate (Name,Var,w, 1 , 0 , 0 , 0 , COLOR_FORMAT_XRGB_NOALPHA )) printf ( "Error create Resource: " + DoubleToString ( GetLastError (), 0 ));
   }
   //tt=GetMicrosecondCount()-tt;
   //Print("!!!!!!!!  =  "+string(tt));
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template < typename T>
CStructArr::~CStructArr() {
   if ( _UninitReason != REASON_RECOMPILE && _UninitReason != REASON_CHARTCHANGE ) ResourceFree (Name);
}
//+------------------------------------------------------------------+
template < typename T>
bool CStructArr::Set(T &var[]) {
   size = ArraySize (var);
   ArrayResize (value,size);
   w= 1 +size* sizeof (T)/ 4 ;
   ArrayResize (Var,w);
   for ( int j= 0 ; j<size; j++) {
      su.st=var[j];
       for ( int i= 0 ; i< sizeof (T)/ 4 ; i++) Var[j* sizeof (T)/ 4 +i]=su.u[i];
      value[j]=var[j];
   }
   if (! ResourceCreate (Name,Var,w, 1 , 0 , 0 , 0 , COLOR_FORMAT_XRGB_NOALPHA )) {
       printf ( "Error create Resource: " + DoubleToString ( GetLastError (), 0 ));
       return ( false );
   } else return ( true );
}
//+------------------------------------------------------------------+
ZY TF 간의 매개변수 전송을 위해 터미널 의 전역 변수 를 사용하는 것은 매우 비뚤어진 결정이라고 생각합니다.
 
Nikolai Semko :

어떻게든 KB에 적어두겠습니다.
실제로 여기에 클래스가 있습니다.
표시기에 두 줄만 추가하면 됩니다.

  • OnInit 전에 이 클래스의 인스턴스를 만들고 TF 간에 전달할 구조 배열을 바인딩합니다. 이것이 첫 번째 초기화가 아닌 경우 구조 배열은 이전 TF의 데이터로 채워집니다.
  • OnDeinit에서 이 클래스의 유일한 메서드를 통해 배열을 저장합니다.

ZY TF 간의 매개변수 전송을 위해 터미널 의 전역 변수 를 사용하는 것은 매우 비뚤어진 결정이라고 생각합니다.

고마워, 알았어.

 
Nikolai Semko :

실제로 여기에 클래스가 있습니다.

언뜻 보기에 T[]<->uint[] 변환의 구현은 차선책입니다.
 
fxsaber :
언뜻 보기에 T[]<->uint[] 변환의 구현은 차선책입니다.

오래전에 이 코드를 작성했습니다. 아마도.
최적화 할 특별한 것은없는 것 같습니다. 어쩌면 작은 일에만.
어쨌든, 당신은 시장에서 나의 최신 무료 제품에서 이 수업을 실제로 시도할 수 있습니다.

더 나은 구현을 제안해 주시면 감사하겠습니다.

 
Nikolai Semko :

더 나은 구현을 제안해 주시면 감사하겠습니다.

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

라이브러리: TradeTransactions

fxsaber , 2019.03.15 07:36

 // Быстрый кастинг массивов.
#include <fxsaber\TradeTransactions\Convert.mqh> // https://www.mql5.com/ru/code/22166

void OnStart ()
{
   MqlTick Ticks[];

   MqlRates Rates[];  
   CopyRates ( _Symbol , PERIOD_CURRENT , 0 , 10 , Rates); // Получили котировки.
  CONVERT::ArrayToArray(Rates, Ticks);               // Кастинг MqlRates[] -> MqlTick[].

   MqlRates Rates2[];    
  CONVERT::ArrayToArray(Ticks, Rates2);             // Кастинг MqlTick[] -> MqlRates[].
   ArrayPrint (Rates2);                               // Убедились, что все корректно.
}
파일:
Convert.mqh  4 kb
 
Mikhail Nazarenko :
다른 시간 프레임으로 전환할 때 표시기의 전역 변수 , 구조, 개체를 전송하는 방법은 무엇입니까? 구글이 찾지 못했습니다.

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

라이브러리: TradeTransactions

fxsaber , 2018.12.17 23:48

리소스를 통해 무엇이든 공유할 수 있습니다.

 // Пример обмена любыми данными (включая строковые массивы).

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166

#define PRINT(A) Print ( #A + " = " + ( string )(A));

void OnStart ()
{    
   // Произвольные данные для примера
   string Str[] = { "123" , "Hello World!" };
   double Num = 5 ;
   MqlTick Tick = { 0 };
  Tick.bid = 1.23456 ;

   const RESOURCEDATA< uint > Resource; // Ресурс для обмена данными
  CONTAINER< uint > Container;         // Создаем контейнер - все будет храниться в массиве простого типа (в примере выбран uint)
  
   // Заполняем контейнер разными данными
  Container[ 0 ] = Str;
  Container[ 1 ] = Num;
  Container[ 2 ] = Tick;
    
   // Распечатаем типы хранимых в контейнере данных
   for ( int i = 0 ; i < Container.GetAmount(); i++)
    PRINT(Container[i].GetType())

  Resource = Container.Data;  // Отправили данные на обмен
  
  CONTAINER< uint > Container2; // Сюда будем получать данные
  
  Resource.Get(Container2.Data); // Получили данные
      
   // Получим данные в исходном виде
   string Str2[];
  Container[ 0 ].Get(Str2);                 // Получили массив
   ArrayPrint (Str2);

  PRINT(Container[ 1 ].Get< double >())       // Получили число
  PRINT(Container[ 2 ].Get< MqlTick >().bid) // Получили структуру   
}
 
fxsaber :

아니요, 불행히도 근거가 없습니다. 나는 당신의 성경에 들어가지 않을 것입니다.
나는 이미 당신의 코드를 이해하려고 노력했고 내가 아직 그것에 대해 성장하지 못했다는 것을 깨달았습니다. :))

어쨌든 모든 포함을 열면 코드가 소스 코드에서 더 길어지고 실행 가능합니다.

저도 당신의 바이블을 사용하다가 몇 번이나 화상을 입었고, 브레이크가 무너질 때까지 오랜 시간 동안 브레이크의 원인을 알아냈습니다. 그 후 그는 포기했다.

많은 포함자로 구성된 코드를 사용할 때의 주요 어려움은 디버깅이 매우 복잡하다는 점입니다. 각 단계마다 새 클래스, 정의 또는 매크로가 있을 때입니다.
그리고 내 알고리즘의 속도를 크게 높이는 것이 거의 불가능하다는 것을 이해하기 때문에 테스트 시간에 대해 유감스럽게 생각합니다.
지금 제 잼에서 볼 수 있는 유일한 것은 CopyArray 대신 일부 위치에서 사이클을 사용한다는 것입니다. 이 수정 후에 내 코드는 성능과 가독성 면에서 거의 완벽할 것입니다.

 
Nikolai Semko :

지금 내 잼에서 볼 수있는 유일한 것은 CopyArray 대신 일부 위치에서 사이클을 사용한다는 것입니다. 이 수정 후에 내 코드는 성능과 가독성 면에서 거의 완벽할 것입니다.

성능 측정을 작성하면 비교하는 것이 흥미로울 것입니다.

 

:)

이제 아무도 "목발", "자전거의 발명", "다른 터미널로 데이터 전송의 어려움", " MQL 도구를 사용하여 작업을 해결해야 한다 "에 대해 쓰지 않는 것이 이상합니다.
메타쿼타의 결정은 목발과 자주색 톤임이 밝혀졌습니다.

사유: