내 접근 방식. 코어 - 엔진. - 페이지 92

 
Maxim Kuznetsov :

일반적으로 어드바이저, 인디케이터, 스크립트 간의 데이터 교환에는 GlobalVariables 및 파일만 있고 배타적으로 있습니다.

위의 4가지 포인트는 모두 물고기 부족으로 인한 현지 "해킹"입니다. 위의 4가지 포인트는 모두 임의 데이터 교환을 위한 것이 아닌 데이터 배열을 위한 메커니즘을 사용합니다.

GlobalVariables는 메시징을 위해 정기적으로 생성되었다고 생각할 수 있습니다. 그들은 어리석었다고 말했습니다. 사실, 이것은 다른 아이템과 동일한 해킹입니다.

 
fxsaber :


... 대략적으로 말하자면, 리소스를 통한 쓰기/읽기 틱의 전체 주기는 초당 4백만 틱의 속도로 진행됩니다.

리소스에 대한 읽기/쓰기는 매우 빠릅니다. 그러나 이것이 그러한 전송에 얼마나 적합합니까?

1. 스트로나 A. 타이머 이벤트. 이벤트에서 변경된 모든 매개변수 값을 수집하여 문자열로 변환합니다. 문자열을 Char로 변환하고 리소스에 씁니다. 우리는 파티 B에게 메시지 신호를 보냅니다.

2. Side B. OnChartEvent() 이벤트는 메시지 신호를 수신하고 리소스를 열고 이를 읽고 매개변수 코어에 새 값을 채우고 필요한 요소를 다시 그렸습니다.

이 이벤트가 타이머의 빈도로 계속 실행되면 어떻게 될까요?

문제는 다른 옵션이 있는 경우 이를 위해 리소스를 가장 잘 사용하는 방법입니다.

//------------------------------------------------ -------------------------------------------------- --------------------

  • EventChartCustom() 옵션에는 두 가지 단점이 있습니다.

  1. 메시지가 이벤트 대기열에 추가됩니다.
  2. 소포는 127자를 초과할 수 없습니다. 따라서 1000자의 메시지를 분해한 다음 다시 조합해야 합니다. 그리고 메시지의 각 부분은 이벤트 대기열에 있습니다.
  • 그래프를 통한 전송 옵션. 개체는 메시지를 각각 64자의 팩으로 분할하고 개체에 대한 설명에 작성한 다음 조합해야 합니다. 흥미롭게도 이 옵션은 가장 빠르지만 라인 길이가 증가할수록 속도가 감소합니다. 즉, ObjectSetString()에 대한 각 호출 은 3마이크로초입니다. 하지만 문자열이 1000자라면 64자로 나누어서 ObjectSetString()을 8번 정도 호출해야 합니다. 8*3 = 24ms. 그런 다음 문자열을 수집하는 데 동일한 시간이 걸립니다. 따라서 문자열이 10,000자라면 이 방법은 리소스를 통해 작업하는 방법에 확실히 접근하기 시작할 것입니다. (리소스를 저장하고 읽는 시간 + 문자열을 uint 및 그 반대로 변환하는 시간입니다.)
리소스 옵션은 끝까지 테스트되지 않은 상태로 유지됩니다. 오늘 테스터에서 확인해보고 드디어 만능이 될 수 있을지가 명확해 집니다.
 
Реter Konow :

이 이벤트가 타이머의 빈도로 계속 실행되면 어떻게 될까요?

문제는 다른 옵션이 있는 경우 이를 위해 리소스를 가장 잘 사용하는 방법입니다.

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

프로그램 간의 데이터 교환

fxsaber , 2018.11.21 13:12

상호 작용을 위한 다양한 옵션을 이렇게 자세하게 그릴 시간이 많을 것입니다. 불행히도 나는 그러한 자원이 없습니다.

다음은 완전한 상호 작용이 있는 주제에 대한 기사입니다 . 각 건물은 특정 작업을 위해 벽돌로 지어졌습니다. 가능한 모든 벽돌은 분기의 맨 처음에 표시됩니다. 나머지는 건축업자의 몫입니다.

 
fxsaber :

이 기사는 리소스를 통해 두 프로그램의 연결을 확인하지 않으며 그 중 하나는 테스터에 있습니다.

 

노동조합 문제는? 예를 들어주세요:

union UZ{
   double d;
   int i[ 2 ];
};

void OnStart (){

   UZ u1;
   UZ u2;
   
   u1.d= 12345.678 ;
   
   ArrayCopy (u2.i,u1.i);
   
   Alert (u2.d);

}
 
Реter Konow :

이 기사는 리소스를 통해 두 프로그램의 연결을 확인하지 않으며 그 중 하나는 테스터에 있습니다.

벽돌에 관한 문장을 읽으십시오.

 
fxsaber :

...

이 기사는 참새에게 대포를 발사합니다. 많은 기사처럼. 나는 기사에서 그것을 알아내는 것보다 문제를 스스로 해결하고 싶습니다.

모든 작업을 10배 더 쉽고 시각적으로 수행할 수 있습니다. 그리고 기사에서-악마는 다리를 부러 뜨릴 것입니다 ...


그리고 테스터의 리소스로 작업을 확인하지 않았다면 이 기사의 요점은 무엇입니까?

 
Реter Konow :

그리고 테스터의 리소스로 작업을 확인하지 않았다면 이 기사의 요점은 무엇입니까?

토론을 떠났습니다.

 

이 결정은 일종의 넌센스입니다. 내가 뭔가 잘못하고 있는 것 같다.

간단히 말해서:

StringToCharArray() 함수는 문자 배열만 허용합니다.

ResourceCreate() 함수는 uint 배열만 허용합니다.

따라서 char 배열의 내용( 변환된 string 으로 채워짐)을 uint 배열로 중간 재작성해야 합니다.

 
//+------------------------------------------------------------------+
//|                                                    Tester EA.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   //----------------------------------------------
   ObjectCreate ( 0 , "Resource" , OBJ_BITMAP_LABEL , 0 , 0 , 0 );
   ObjectSetString ( 0 , "Resource" , OBJPROP_BMPFILE , "::Resource" );
   //----------------------------------------------
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   uchar Arr[];
   uint   Data[];
   //---------------------------
   string price = ( string ) Bid ;
   //---------------------------
   int width = StringToCharArray (price,Arr);
   //---------------------------
   ArrayResize (Data,width);
   //---------------------------
   ArrayCopy (Arr,Data);
   //---------------------------
   if (! ResourceCreate ( "::Resource" ,Data,width, 1 , 0 , 0 , 0 , COLOR_FORMAT_XRGB_NOALPHA )) Print ( "Resource is not created!" );
   //---------------------------
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   
  }
//+------------------------------------------------------------------+

일반 차트의 표시기:

 //+------------------------------------------------------------------+
//|                                              Resource reader.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer ( 25 ); 
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   uint Data[ 50 ],width,height;
   //-----------------------------
   if (! ResourceReadImage ( "::Resource" ,Data,width,height)) Print ( "Failed to read resource!" );
   else Print ( "Resource is readable!" );
   //-----------------------------
   
  }
//+------------------------------------------------------------------+