기고글 토론 "여러 상품을 거래하는 Expert Advisor 생성" - 페이지 4

 
Interesting:

나는 여전히 버퍼 작업 알고리즘에주의를 기울일 것입니다. 내가 올바르게 이해했다면 하나의 버퍼로 충분할 것입니다 (그래프에 올바르게 계산하고 그리기 만하면됩니다).

추신

그리고 현재 변형에서는 인덕터가 "오른쪽"(현재) 대신 "왼쪽"데이터 (역사의 맨 처음)를 표시한다는 인상을 받았습니다.....

또는이 지표의 논리에서 아무것도 이해하지 못합니다....


예를 들어 EURUSD를 EURUSD로 또는 EURJPY를 EURJPY로 출력하면 모든 것이 정상적으로 작동합니다.

따라서 출력 방향이 올바른 것 같습니다.

나는 여기에서 많은 변형을 시도했으며 심지어 다음과 같이 시도했습니다:

handle1=iMA(InstrumentName,PERIOD_CURRENT,ex_Period_MA_1,0,MODE_SMA, PRICE_CLOSE);

...

copied=CopyBuffer(handle1,0,0,0,Counted_bars,Buf_0);

여전히 아무것도 나오지 않습니다.

적어도 한 화면에 두 개의 다른 도구를 표시하는 예제를 가진 사람이 있습니까?

 
gisip:

다른 상품의 차트가 정상적으로 표시되지 않는 이유는 무엇인가요?

MQL4에서는 모든 것이 작동했지만 여기에서는 동일한 상품에 표시하는 경우에만 작동하며 오류는 없습니다.


잘린 형태로 작동합니다. 수표와 경제를 추가합니다.

#property indicator_separate_window    // 표시기는 별도의 창에 그려집니다.
#property indicator_buffers 1

#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Aqua

input string InstrumentName="EURJPY";

//-- 표시기 배열
double ScreenBuffer[];

//-- 동적 버퍼 --
double ArrayBuffer[];
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnInit() // 특수 init() 함수
  {
//--------------------------------------------------------------------

   IndicatorSetString(INDICATOR_SHORTNAME,InstrumentName);
   SetIndexBuffer(0,ScreenBuffer,INDICATOR_DATA);
   ArraySetAsSeries(ArrayBuffer,true);
   ArraySetAsSeries(ScreenBuffer,true);
   return 0;                          // 종료
  }
//--------------------------------------------------------------------
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[])
  {
   int Counted_bars;   // 작동할 막대 수 
   int copied;

//--------------------------------------------------------------------
   copied=(int)SeriesInfoInteger(InstrumentName,0,SERIES_BARS_COUNT);
   copied=CopyClose(InstrumentName,PERIOD_M1,0,copied,ArrayBuffer);//-- 메모리 버퍼에 데이터 쓰기 -- --

   for(int i=0; i<copied; i++)
     {
      ScreenBuffer[i]=ArrayBuffer[i];
     }

//--------------------------------------------------------------------
   return(rates_total);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,0,-1);             // 차트에서 모든 개체가 삭제됩니다.
  }
 
gisip:

예를 들어 EURUSD를 EURUSD로 출력하거나 EURJPY를 EURJPY로 출력하면 모든 것이 정상적으로 작동합니다.

따라서 출력 방향은 어느 정도 정확합니다.

저는 여기서 많은 변형을 시도했고 심지어 다음과 같이 시도했습니다:

handle1=iMA(InstrumentName,PERIOD_CURRENT,ex_Period_MA_1,0,MODE_SMA, PRICE_CLOSE);

...

copied=CopyBuffer(handle1,0,0,0,Counted_bars,Buf_0);

여전히 아무것도 나오지 않습니다.

적어도 어떻게 든 한 화면에 두 개의 다른 도구를 표시하는 예제를 가진 사람이 있습니까?

MQL4의 소스 코드가 있나요?


나는 이미 현재 도구에 대한 색인을 만들고 100 % 디버깅하는 대안을 제안했습니다. 그런 다음 Expert Advisor 또는 다른 인디케이터에서 필요한 매개 변수를 사용하여 쉽게 호출할 수 있습니다.

이러한 구현을 사용하면 계산기에 전달 된 매개 변수가 다른 상품에 대해 정확하지 않기 때문에 지표의 기본 논리를 변경해야합니다(막대 수 및 기타 항목이 일치하지 않을 수 있음).....

그리고 대체로이 개념은 그다지 "정확하지"않습니다 (가볍게 말하면).


추신

요컨대, 여기에는 두 가지 옵션이 있습니다:

1. 현재 TF 및 기기에 대한 모든 것을 실현하고 작동 가능성을 확인합니다. 그런 다음 iCustom()을 사용합니다;

2. 계산기에서 매개 변수에 지정된 기기에 대한 모든 데이터를 절대적으로 수신하는 방식으로 인듀서의 로직을 다시 작성합니다 (비용이 많이 들고 정확하지 않은 방법).

Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Доступ к таймсериям и индикаторам / Bars - Документация по MQL5
 
gisip:
변경했는데도 여전히 작동하지 않으면 차트가 사실이 아닙니다.

인디케이터에서 이 작업을 수행하고

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnInit() // 특수 init() 함수
  {
//--------------------------------------------------------------------

   IndicatorSetString(INDICATOR_SHORTNAME,InstrumentName);
   SetIndexBuffer(0,ScreenBuffer,INDICATOR_DATA);
   ArraySetAsSeries(ScreenBuffer,true);
   
   return 0;                          // 종료
  }

를 클릭하고 배열 및 시계열의 인덱싱 방향 섹션을 읽어보세요.

 
DC2008:

잘린 양식이 작동합니다. 수표와 경제성을 추가하세요.

이 두 가지는 실제로 필요하지 않습니다.

//1

//-- 동적 버퍼 --
double ArrayBuffer[];
...............
ArraySetAsSeries(ArrayBuffer,true);

//2

   for(int i=0; i<copied; i++)
     {
      ScreenBuffer[i]=ArrayBuffer[i];
     }
 
Interesting:

이 두 가지는 필요하지 않습니다.

사실, 그렇습니다.
 

네, 성공한 것 같아요!

정말 감사합니다!!!

더 테스트해볼게요.

 

트레이딩을 시각화해야 합니다. 전문가 어드바이저는 다중 통화입니다. EURUSD에 매달려 있고 다른 통화쌍에 대한 거래를 연다고 가정해 봅시다. 결과에 차이가 있고, 제 잘못이라는 것을 알고 있지만 확인할 수 없습니다(전문가 조언자가 EURUSD에 매달려 있을 때는 AUDUSD 거래가 있는 차트를 열 수 없습니다).

전문가 조언이 AUDUSD에 걸려 있으면 차트를 열면 제가 프로그래밍한 대로 작동하지만 EURUSD에 걸려 있으면 결과가 달라지는데 그 이유를 알 수 없습니다. 거래를 시각화하면 매우 유용할 것 같습니다.

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

7.Exp_TEMA.mq5를 테스트할 때, Told[] Tnew[1]표현식은 다음 값을 얻습니다:
Told[] 표현식을 평가할 수 없음
Tnew[1] 잘못된 배열 범위.
이러한 값은 무엇을 의미하며 전문가 조언자의 작업 결과에 어떤 영향을 미칠까요?

8. Exp_TEMA.mq5가 테스트 중에 바 내부에서 거래를 여는 이유는 무엇인가요?

9. 포지션을 청산하고 반대 방향으로 포지션을 여는 대신 플립, 즉 반대 방향으로 두 배의 볼륨으로 포지션을 여는 경우 코드 감소, 거래 체결 시간 단축, 슬리피지 감소, 비용(수수료 등) 감소로 이어질 수 있나요?

바 내부 거래.

 
ias:

7.Exp_TEMA.mq5를 테스트할 때 Told[] Tnew[1]표현식은 다음 값을 얻습니다.
Told[] 표현식을 평가할 수 없음
Tnew[1] 잘못된 배열 범위
이 값은 무엇을 의미하며 Expert Advisor의 작업에 어떻게 영향을 미칩니까?

Tnew[1] 잘못된 배열 범위의 경우 범위 오버런인 것 같습니다. 배열 항목의 번호 매기기는 0부터 시작한다는 것을 잊지 마세요!