MQL5를 사용하는 주식 오실레이터 - 페이지 2

 
DV2010 : 하지만 왜   변화 하는 가치(체크!)가 Indicator 배열에 쓰여지지만 변화하는 Equity 값은 Indicator에 표시되지 않습니다.

거기에는 아무 것도 쓰여 있지 않으며 루프가 호출되지 않습니다. 직접 확인하세요.
 

문제의 사실은 사이클이 모든 틱에서 호출된다는 것입니다!

여기, 직접 확인하십시오! 루프 본문에 출력을 특별히 삽입했습니다.

 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[]){
   for ( int i = prev_calculated; i <= rates_total- 1 ; ++i){
       Print ( "Equity - OnCalculate - Cycle: prev_calculated=" ,prev_calculated, "   rates_total=" ,rates_total);
       Print ( "Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=" , AccountInfoDouble ( ACCOUNT_EQUITY ));
      Values[i] = AccountInfoDouble ( ACCOUNT_EQUITY );
   }
   return rates_total;
}

최종 결과는 다음과 같습니다.

 2011.01 . 20 13 : 58 : 56      Core 1   OnTester result 0
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 23 : 59 : 59    order performed sell 0.15 at 1.33829 [ # 13 sell 0.15 EURUSD at 1.33829 ]
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 23 : 59 : 59    deal performed [ # 13 sell 0.15 EURUSD at 1.33829 ]
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 23 : 59 : 59    deal # 13 sell 0.15 EURUSD at 1.33829 done (based on order # 13 )
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 23 : 59 : 59    position closed due end of test at 1.33829 [buy 0.15 EURUSD 1.33593 ]
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 22 : 00 : 00    Equity - OnCalculate - Cycle: AccountInfoDouble ( ACCOUNT_EQUITY )= 9949.299999999999
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 22 : 00 : 00    Equity - OnCalculate - Cycle: prev_calculated= 6418    rates_total= 6419
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 21 : 00 : 00    CTrade::PositionOpen: instant buy 0.15 EURUSD at 1.33593 [done at 0.00000 ]
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 21 : 00 : 00    order performed buy 0.15 at 1.33593 [ # 12 buy 0.15 EURUSD at 1.33593 ]
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 21 : 00 : 00    deal performed [ # 12 buy 0.15 EURUSD at 1.33593 ]
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 21 : 00 : 00    deal # 12 buy 0.15 EURUSD at 1.33593 done (based on order # 12 )
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 21 : 00 : 00    instant buy 0.15 EURUSD at 1.33593 ( 1.33577 / 1.33593 / 1.33577 )
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 21 : 00 : 00    CTrade::PositionClose: instant buy 0.15 EURUSD at 1.33593 [done at 0.00000 ]
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 21 : 00 : 00    order performed buy 0.15 at 1.33593 [ # 11 buy 0.15 EURUSD at 1.33593 ]
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 21 : 00 : 00    deal performed [ # 11 buy 0.15 EURUSD at 1.33593 ]
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 21 : 00 : 00    deal # 11 buy 0.15 EURUSD at 1.33593 done (based on order # 11 )
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 21 : 00 : 00    instant buy 0.15 EURUSD at 1.33593 ( 1.33577 / 1.33593 / 1.33577 )
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 21 : 00 : 00    Equity - OnCalculate - Cycle: AccountInfoDouble ( ACCOUNT_EQUITY )= 9929.65
2011.01 . 20 13 : 58 : 56      Core 1    2011.01 . 14 21 : 00 : 00    Equity - OnCalculate - Cycle: prev_calculated= 6417    rates_total= 6418
 
DV2010 :

문제의 사실은 사이클이 모든 틱에서 호출된다는 것입니다!

여기, 직접 확인하십시오! 루프 본문에 출력을 특별히 삽입했습니다.

최종 결과는 다음과 같습니다.

그리고 테스트는 어떻습니까? 차트에서 지표를 실행하면 모든 것이 표시됩니다. 내 수정 사항을 포함하는 것을 잊지 마십시오.
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 

역사에 대한 테스트 기간 내 자본의 변화를 볼 필요가 있음에도 불구하고 여기에서 테스트합니다.

편집이 완료되고 지표가 테스트 모드 와 새 차트로 드래그 앤 드롭으로 시작되었습니다.

표시기는 현재 시세까지의 전체 기간과 모든 기간에서 작동합니다(또는 "모든 것을 보게 될 것"은 정확히 무엇을 의미합니까?)

그러나 Equity 값은 일정하게 유지되지만 로그 출력에는 변경되는 것으로 표시됩니다.

(그렇지 않으면 Print를 통하지 않고 주기가 작동하는지 여부를 다른 방법으로 알 수 있습니까?)

...만약에 대비하여 다음은 표시기가 삽입된 Expert Advisor의 "골격"입니다.

 #property copyright "Copyright 2010, Pavlov Sergei"
#property link       ""
#property version   "1.00"

#include <\..\Experts\_My\Classes\ClassExpert\ClassExpert.mqh>
ClassExpert Expert1;

int Equity1= 0 ;
void OnInit (){
   Equity1 = iCustom ( NULL , 0 , "Equity" ,
                           5 ,           // Период
                           0 ,           // Смещение
                           MODE_SMA ,   // Метод рассчета
                           PRICE_CLOSE // считаем по ценам закрытия)
                          );
   Expert1.Init();
}
void OnTick (){
   Expert1. OnTick ();
}
void OnDeinit ( const int reason){
   Expert1.Deinit();
}
 
DV2010 :

역사에 대한 테스트 기간 내 자본의 변화를 볼 필요가 있음에도 불구하고 여기에서 테스트합니다.

편집이 완료되고 지표가 테스트 모드와 새 차트로 드래그 앤 드롭으로 시작되었습니다.

그리고 지표는 현재 시세까지의 전체 기간과 모든 기간에 모두 작동합니다(또는 "모든 것을 보게 될 것"은 정확히 무엇을 의미합니까?)

그러나 Equity 값은 일정하게 유지되지만 로그 출력에는 변경되는 것으로 표시됩니다.

(그렇지 않으면 Print를 통하지 않고 주기가 작동하는지 여부를 다른 방법으로 알 수 있습니까?)

...만약에 대비하여 다음은 표시기가 삽입된 Expert Advisor의 "골격"입니다.

잘못된 지표를 EA 에 삽입해도 소용이 없으며 개선되지 않습니다. 내 버전을 아직 확인하셨습니까?
 

제가 틀릴 수도 있지만 테스트가 완료된 후 차트에 표시되는 지표 의 표시와 테스트 중에 계산한 것을 비교하지 않습니까?

사실 테스터의 사용자 지정 지표의 결과(계산된 배열)는 어떤 식으로든 차트로 전송되지 않지만 지정된 지표는 차트에서 새 계산을 위해 단순히 시작됩니다.

Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 

이 지표를 분 차트에서 실행하면( 오픈 포지션이 있는 경우 ) 10-15분 안에 비슷한 그림을 얻을 수 있습니다.


코드:

 //+------------------------------------------------------------------+
//|                                             Equity_Indicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link       "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1   "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1   1
//--- indicator buffers
double Values[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,Values, INDICATOR_DATA );
   PlotIndexSetInteger ( 0 , PLOT_DRAW_BEGIN , 100 );
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , EMPTY_VALUE );
   ArraySetAsSeries (Values,false);
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| 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[])
  {


   Print ( "prev_calculated=" ,prev_calculated, "   rates_total=" ,rates_total);
   int limit=prev_calculated;
   if (limit> 0 ) limit--;

//---Блок заполнения Индикатора и журнала сообщений значениями
   for ( int i=limit; i<rates_total;++i)
     {
      Values[i]= AccountInfoDouble ( ACCOUNT_EQUITY );
     }
   return rates_total;
  }
//+------------------------------------------------------------------+
 

Rosh , 나는 이미 내 지표가 무엇에 대해 잘못되었는지 물었고 내가 정확히 어떻게 확인했는지에 대해 썼습니다.   당신의 선택을 포함하여. 그리고 나는 이것을 가능한 한 자세하게 설명하려고 노력했지만, 당신은 "주기가 작동하지 않습니다"와 "당신이 모든 것을 스스로 볼 것입니다"라고 간략하게만 썼습니다.

... Renat , 테스트 완료 후 차트에 표시기가 표시되는 것은 테스트 중에 수행된 계산과 표시기 배열의 채우기를 기반으로 정확하게 발생합니다. 그런데 테스터의 결과가 테스터의 커스텀 지표 차트로 전송되지 않는다는 것은 무엇을 의미합니까?

그렇다면 왜 그것들이 필요하고 코드에서 배열 할당을 제거한 직후에 표시줄이 사라지는 이유는 무엇입니까(일정한 수평 할당이지만 사라짐)?

OnCalculated 에 채워진 표시기 값의 배열 사이의 대응은 나에게 보였다. 차트의 표시기 값이 모호하지 않으면 표시기 값을 초기화하는 방법은 무엇입니까?

이해하기 힘든데.. 하찮은 일인 것 같긴 한데, 지금 며칠째 고심하고 있는데, 역사에서 어떻게 다르게 풀 수 있고, 과연 풀릴 수 있을지 힌트조차 줄 수 있는 사람을 찾기 어렵다. 전혀 해결되지 않습니다.

다시 한 번, 내가 이해한 대로, 나는 (내가 틀렸다면 정정하고 그것이 어렵게 만들지 않는다면).

하나.      테스터에서 테스트 기간을 지정하고 내 지표가 첨부된 Expert Advisor를 선택합니다.

2.      OnCalculated 에 대한 첫 번째 호출 매개변수로 호출 됨 prev _ 계산 =0 및 비율 _ total = 테스트 시작에 해당하는 눈금(막대)의 수. 이 기간 동안 잔액의 가치는 초기 및 일정한 수준으로 유지됩니다.

삼.      테스트 기간 내에 막대에 의한 OnCalculated대한 후속 호출은 개별 막대에 대해 발생하며 여기에서 변경되는 데이터로 표시기 값 배열을 초기화할 수 있습니다(예: 내가 쓴 대로 가격을 복제했지만 그렇다면 가격을 변경하는 대신 자산 가치 를 변경하는 대신 초기화할 수 없는 이유는 무엇입니까?)

그리고 일반적으로 여기 있습니다. 전문가입니다. 이것이 해결되는 간단한 작업입니까, 아니면 MetaTrader 가 여전히 그러한 "높이"로 성장하고 성장합니까? :)))

이 문제를 해결하기 위한 간단한 비전을 제안했지만 작동하지 않습니다.

그렇다면 백테스팅 결과를 기반으로 한 가격 차트 아래의 주가 차트는 어떻게 구현될 수 있을까요?

 
한 가지만 답을 드리자면 시각화 모드가 나올 때까지 문제를 푸는 것이 그리 쉽지는 않습니다. 테스트할 때 지분 데이터를 파일에 쓰는 한 가지 솔루션이 있습니다. 그런 다음 이 파일의 데이터를 표시기 버퍼에 기록하여 주식 차트를 구성합니다.
 

Rosh, 온라인 버전은 이미 게시되었지만 주로 History로 작업하는 사람으로서 나는 과거 데이터를 기반으로 한 작업 버전이 필요합니다. 그리고 여기서 가장 큰 어려움이 무엇인지 이해하는 것은 여전히 어렵습니다.

더 적당한 수의 거래 로 인해(구매 및 판매를 클릭할 시간이 거의 없는 추가 스캘퍼가 아닌 한) 온라인 균형 차트는 이미 거래자가 제공합니다.

실제로 주식의 역학 관계는 수백, 수천 건의 거래가 있는 오랜 역사에 걸쳐 중요해졌지만 테스터의 차트에서 이러한 역학과 가격 역학을 단순하게 비교하는 것은 원칙적으로 제공되지 않습니다(물론, MetaQuote는 개별 시리즈의 약한 위치와 강한 위치를 분석하지 않고 기성품 Expert Advisors를 빠르게 선별하는 것이 프로그래머에게 가장 중요하다고 생각합니다.