찻주전자의 질문 - 페이지 53

 
무조건적이고 어리석은(무지에서) 각 틱에서 지표를 재생성하는 것과 지표를 합리적으로(희귀하고 필연적으로) 생성하는 것을 혼동하지 마십시오. 첫 번째 경우에는 백 배 브레이크와 리소스 누출이 발생하고 두 번째 경우에는 이상적인 작업입니다.
 
Renat :
각 진드기에 대한 무조건적이고 어리석은 (무지에서) 지표 재생성과 지표의 합리적인 (희귀하고 필연적인) 생성을 혼동하지 마십시오. 첫 번째 경우에는 백 배 브레이크와 리소스 누출이 발생하고 두 번째 경우에는 이상적인 작업입니다.

나는 Karlson 이 무의식적으로 실수를 저질렀다는 것을 완벽하게 이해하고, 이 실수의 본질도 이해합니다.

그러나 그의 문제를 해결하기 위한 합리적인 계획을 제시하십시오. 사람은 표시기에 작성된 코드를 사용해야 하지만 이 코드의 매개변수는 표시기 데이터에 대한 각 호출 전에 동적으로 결정됩니다.

dll이 포함되어 있지만 솔루션이 있지만 순수한 mql을 옹호하고 있으므로 mql에서 솔루션을 제공하십시오.

ZY 이벤트에서 OnCalculate() 및 계산에 대해 이미 언급했지만 이벤트를 통해 3개의 매개변수를 전달할 수 있습니다. 내 솔루션에서 dll은 매개변수가 있는 배열의 주소를 long을 통해 전송하는 구조로 제공되며 표시기 데이터는 이 주소에서 얻습니다.

mql에 솔루션이 있는 경우 손가락을 가리키기만 하면 사람들이 여기에서 이해하고 있습니다.

 
Urain :

나는 Karlson 이 무의식적으로 실수를 저질렀다는 것을 완벽하게 이해하고, 이 실수의 본질도 이해합니다.

그러나 그의 문제를 해결하기 위한 합리적인 계획을 제시하십시오. 사람은 표시기에 작성된 코드를 사용해야 하지만 이 코드의 매개변수는 표시기 데이터에 대한 각 호출 전에 동적으로 결정됩니다.

얼마나 많은 다른 지표를 생성해야 합니까? 확실히 10개를 넘지 않아야 합니다. 그렇지 않으면 리소스 낭비일 뿐입니다.

확실히 매개변수에 변경 사항이 있으므로 필요한 지표가 필요에 따라 추가되는 지표 컬렉션을 간단히 생성할 수 있습니다. 표시기가 분명히 10개 미만이고 명시적 의미(초기, 확인, 수정 등)가 있는 경우 필요한 매개변수를 사용하여 명명된 핸들 변수를 생성할 수 있습니다.

 
Urain :

그러나 그의 문제를 해결하기 위한 합리적인 계획을 제시하십시오. 사람은 표시기에 작성된 코드를 사용해야 하지만 이 코드의 매개변수는 표시기 데이터에 대한 각 호출 전에 동적으로 결정됩니다.

조금 생각했다. 코드 매개변수가 표시기 데이터에 대한 각 호출 전에 동적으로 결정되는 경우 이러한 매개변수를 결정하는 절차를 표시기 코드에도 푸시하지 않는 이유는 무엇입니까? 즉, 모든 것, 절대적으로 모든 계산이 지표에 있습니다.

아니면 그러한 캠페인이 근본적으로 불가능한 상황이 있습니까?

 
왜 그런 간단한 표시기에서 0(오른쪽에서 첫 번째) 막대가 주간 그래프를 제외한 모든 곳에서 계산되지 않는지 알려주십시오.

 #include <MovingAverages.mqh>
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_color1 LightBlue
#property indicator_type1   DRAW_LINE
#property indicator_width1 2

input int PERIOD = 80 ;
input ENUM_MA_METHOD   method = MODE_SMA ;
input ENUM_APPLIED_PRICE PRICE = PRICE_CLOSE ;
double Uptrend[];
double ExtRsiArray_TF2[];
double mabuf[];
int handleMA,handleMA2;

int OnInit ()
  {
   SetIndexBuffer ( 0 , Uptrend);
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0 );  
   ArraySetAsSeries (Uptrend, true );
   handleMA= iMA ( NULL , 0 , PERIOD, 0 , method, PRICE);
   handleMA2= iMA ( NULL , 0 , PERIOD/ 2 , 0 , method, PRICE);
   return ( 0 );
  }
  
double WMA( int ai_0, int a_period_4) {
int some;
if (a_period_4==PERIOD)
 if ( CopyBuffer (handleMA, 0 ,ai_0, 1 ,ExtRsiArray_TF2)<= 0 )
  { Alert ( "Error" , GetLastError ());
   return ( 0 );
  }
some=PERIOD/ 2 ;
if (a_period_4==some)
 if ( CopyBuffer (handleMA2, 0 ,ai_0, 1 ,ExtRsiArray_TF2)<= 0 )
  { Alert ( "Error" , GetLastError ());
   return ( 0 );
  }
return (ExtRsiArray_TF2[ 0 ]);
}

int OnCalculate ( const int rates_total,      
                 const int prev_calculated, 
                 const int begin,          
                 const double & price[] 
   )
  { ArraySetAsSeries (price, true );
     int counted_bars = prev_calculated; 
     if (counted_bars < 0 ) return (- 1 ); 
     int x = 0 ; 
     int p = MathSqrt (PERIOD);              
     int e = rates_total - counted_bars + PERIOD + 1 ; 
     double vect[], trend[]; 
     if (e > rates_total) e = rates_total;    
     ArrayResize (vect, e); 
     ArraySetAsSeries (vect, true );
     ArrayResize (trend, e); 
     ArraySetAsSeries (trend, true );
     ArrayResize (mabuf, e); 
     ArraySetAsSeries (mabuf, true );
     for (x = 0 ; x < e; x++)        vect[x] = 2 *WMA(x, PERIOD/ 2 ) - WMA(x, PERIOD);
     if (method== MODE_SMA )
    SimpleMAOnBuffer(e,prev_calculated,PERIOD+ 1 ,p,vect,mabuf);

     for (x = 0 ; x < e-PERIOD; x++) Uptrend[x] = mabuf[x];
     return (rates_total);                
  }
 
Yedelkin :

조금 생각했다. 코드 매개변수가 표시기 데이터에 대한 각 호출 전에 동적으로 결정되는 경우 이러한 매개변수를 결정하는 절차를 표시기 코드에도 푸시하지 않는 이유는 무엇입니까? 즉, 모든 것, 절대적으로 모든 계산이 지표에 있습니다.

아니면 그러한 캠페인이 근본적으로 불가능한 상황이 있습니까?

예를 들어 매개변수가 다른 지표에 의해 계산되어 조언자에게 반환되고, 예를 들어 뉴런을 기반으로 한 조언자가 사용할 모델을 결정하는 경우와 같은 상황이 있습니다. 어떤 매개변수 세트가 적용될지 미리 알지 못합니다.

 
Expert :
왜 그런 간단한 지표에서 0(오른쪽에서 첫 번째) 막대가 주간 그래프를 제외한 모든 곳에서 계산되지 않는지 알려주십시오.


죄송합니다) 여기에 대체됨: SimpleMAOnBuffer(e,prev_calculated, PERIOD+ 1 ,p,vect,mabuf); e-rates_total 대신 모든 것이 작동함)
 
Expert :
죄송합니다) 여기에 대체됨: SimpleMAOnBuffer(e,prev_calculated,PERIOD+ 1 ,p,vect,mabuf); e-rates_total 대신 모든 것이 작동함)

닉네임이 Expert 인 사람의 실수를 편집하십시오. 이것은 유머 주제에서 필요합니다.
 

멀티 화폐를 만들려고 합니다. 지금까지 Nikolai Kositsin이 " 다양한 상품을 거래하는 전문가 고문 만들기 "라는 기사에서 제안한 계획에 정착했습니다. 다른 도구에서 동일한 매개변수로 테스트를 실행하면 결과가 다를 때 문제가 발생했습니다. 포럼을 살펴보니 많은 사람들이 OnTimer() 함수를 사용하여 이 문제를 해결할 수 있다는 결론에 도달했습니다. Andrey Khatimlyansky는 다음과 같이 조언 했습니다 .

Отвяжитесь от тиков конкретного инструмента ( OnTick ) - это же мультивалютник! Работайте по таймеру или ловите момент образования бара на всех рабочих инструментах, это будет надежнее.

모든 악기에서 소절이 형성되는 순간을 잡으려고 노력했지만 원하는 결과를 얻지 못했습니다.

예를 들어:

새로운 막대를 정의하도록 설계된 함수에서는 기호와 기간을 명시적으로 지정합니다.

 bool isNewBar( string Symbol_, ENUM_TIMEFRAMES Timeframe)
{
 // В статической переменной будем помнить время открытия последнего бара
 static datetime last_time = 0 ;
 // Текущее время
 datetime lastbar_time = ( ENUM_SERIES_INFO_INTEGER ) SeriesInfoInteger (Symbol_,Timeframe, SERIES_LASTBAR_DATE );

 // Если это первый вызов функции
 if (last_time == 0 )
   {
     // Установим время и выйдем 
    last_time = lastbar_time;
     return ( false );
   }

 // Если время отличается
 if (last_time != lastbar_time)
   {
     // Запомним время и вернем true
    last_time = lastbar_time;
     return ( true );
   }
 // Дошли до этого места - значит бар не новый, вернем false
 return ( false );
}

OnTick() 함수에서 Nikolai Kositsin이 제안한 방식입니다.

예를 들어:

 void OnTick ()
{ 
 // Объявление массивов переменных для торговых сигналов  
 static bool UpSignal[ 2 ], DnSignal[ 2 ];

 // Получение торговых сигналов
 TradeSignalCounter( 0 , остальные параметры);
 TradeSignalCounter( 1 , остальные параметры);

 // Совершение торговых операций
 TradePerformer( 0 , остальные параметры);
 TradePerformer( 1 , остальные параметры);
}


isNewBar(Symbol,Timeframe) 함수는 거래가 수행되는 함수, 즉 TradePerformer(parameters) 에서 호출됩니다.

예를 들어:

 bool TradePerformer(параметры)
{

...

 if (isNewBar(Symbol_,Timeframe))
   {
    Trailing_Stop(параметры);
   
    Open_Source_Position(параметры);
   }
 return ( true );
}


즉, 각각의 악기에 대해 개별적으로 매번 새로운 막대를 확인합니다. 새 막대가 없으면 다음 기호를 확인합니다. 매 틱마다 그렇습니다. 그러나 이 옵션은 작동하지 않습니다.

제시된 계획에서 다중 통화 Expert Advisor의 새 막대 확인을 올바르게 구현하는 방법을 알려주시겠습니까?
 
Urain :
닉네임이 Expert 인 사람의 실수를 편집하십시오. 이것은 유머 주제에서 필요합니다.
이 포럼에서는 인종과 기간에 관계없이 전문가 코드의 오류를 수정할 수 있고 수정해야 합니다. :)