초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 1478

 
MrBrooklin #:

정확히 무엇을 이해하지 못하시나요? EA 초기화 함수를 만드는 방법은 무엇인가요? 그렇다면 초보자를 위한 이 글을 공부해 보세요.

감사합니다, 블라디미르.

그리고 초기화한다는 것은 무엇을 의미합니까))))) 그것은 사람에게 명확하지 않습니다)))))

 
Valeriy Yastremskiy #:

그리고 초기화한다는 게 무슨 뜻이죠))))) 그 사람한테는 좀 불분명합니다)))))

안녕하세요, 발레리! 우리는 그 사람에게 제안 된 기사를 열고 먼저 간단한 설명을 찾습니다:

Далее идет функция инициализации советника. Это функция вызывается первой после запуска советника или смены графика и вызывается только один раз.

Этот раздел - лучшее место для проведения проверок, чтобы убедиться в правильности работы нашего советника.

Например, можно проверить, достаточно ли баров на графике для работы нашего советника и т.п.

Также это лучшее место для получения хэндлов технических индикаторов, которые будут использоваться (в нашем случае это индикаторы ADX и Moving Average).

그리고 더 자세한 설명이 있습니다:

int OnInit()
  {
//--- Получить хэндл индикатора ADX
   adxHandle=iADX(NULL,0,ADX_Period);
//--- Получить хэндл индикатора Moving Average
   maHandle=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);
//--- Нужно проверить, не были ли возвращены значения Invalid Handle
   if(adxHandle<0 || maHandle<0)
     {
      Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
     }

일반적으로 그는 적어도이 기사를 먼저 읽어야합니다. ))

안부, 블라디미르.

 

모두들 좋은 하루 되세요!

자율 학습을 계속하고 있는데 다시 혼란스러운 문제가 발생했습니다. 다음은 스크립트 코드입니다:

//+------------------------------------------------------------------+
//| Input variables                                                  |
//+------------------------------------------------------------------+
input uchar candles = 60;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates price_array[];
   double price_low[];
   ArraySetAsSeries(price_low, true);
   ArraySetAsSeries(price_array, true);
   int copy_low = CopyLow(_Symbol, _Period, 0, candles, price_low);
   if(copy_low > 0)
     {
      int candle_low = ArrayMinimum(price_low, 0, candles);
      int Data = CopyRates(_Symbol, _Period, 0, candles, price_array);
      ObjectCreate(0, "UpwardTrendline", OBJ_TREND, 0, price_array[candle_low].time, price_array[candle_low].low,
                   price_array[0].time, price_array[0].low,0);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_COLOR, Blue);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_WIDTH, 3);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, true);
     }
  }
//+------------------------------------------------------------------+

스크립트는 추세선을 세그먼트로 그려야 했습니다. 이를 위해 이 세그먼트를 그리기 위해 초기 점과 두 번째 점을 설정했습니다. 문서에도 추세선을 만들려면 두 개의 앵커 포인트가 필요하다고 나와 있습니다. 나는 그것이해야 할대로 모든 것을했다고 생각합니다. 내 이해로는 두 번째 지점도 극단적 인 지점이지만 어떤 이유로 세그먼트가 아니라 광선이 그려집니다.


내가 어디에서 잘못했는지 알려주시겠습니까?

안부, 블라디미르.

 

MrBrooklin #:
     

      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_COLOR, Blue);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_WIDTH, 3);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, true);
ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, false);
 
Artyom Trishkin #:

고마워요, 아티옴! 이렇게 간단하고 당연한 것을 이해하기에는 제 지능이 부족했네요. 신의 축복이 있기를!

안부, 블라디미르.

 

여러분, 좋은 아침입니다!

바로 그거예요! "내가 간다, 네 지붕으로!" 그게 저예요. 스크립트를 실행하면

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos(uint pos_buy,uint pos_sell)
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   uint count_buy=0, count_sell=0;
   Calc_Pos(count_buy,count_sell);
   Print("По символу ",_Symbol," открыто: ",count_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",count_sell," коротких позиций");
  }
//+------------------------------------------------------------------+

그리고 이걸 알았어요:

2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  pos_buy 0
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  pos_sell 2
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  По символу EURUSDrfd открыто: 0 длинных позиций
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  По символу EURUSDrfd открыто: 0 коротких позиций

숏 포지션이 두 개 있어야 합니다. 제가 어디에서 실수했는지 알려주시겠어요?

블라디미르입니다.

 
MrBrooklin #:

여러분, 좋은 아침, 좋은 기분입니다!

바로 그거야! "내가 간다, 네 지붕으로!" 저예요. 스크립트를 실행 중입니다:

그리고 이걸 알았죠:

숏 포지션이 두 개 있어야 합니다. 제가 어디에서 실수했는지 알려주시겠어요?

감사합니다, 블라디미르.

마지막 두 개의 인쇄물

변수의 값을 출력하고 있습니다.

uint count_buy=0, count_sell=0;

초기화되었지만 더 이상 아무 것도 할당되지 않았습니다.
즉, 모든 것이 기록된 대로 작동하며 기적은 없습니다.

 
Alexander Sevastyanov #:

마지막 두 개의 인쇄물

는 변수의 값을 출력합니다.

초기화되었지만 더 이상 할당된 것은 없습니다.
즉, 모든 것이 기록된 대로 작동하며 기적은 일어나지 않습니다.

안녕하세요, 알렉산더. 제가 당황했던 부분이 바로 그 부분입니다. 무엇을 할당해야 하나요? Calc_Pos(count_buy, countsell) 함수가 작동해야한다고 생각합니까, 아니면 제가 잘못 이해 한 것입니까?

안녕하세요, 블라디미르.

 
MrBrooklin #:

안녕하세요, 알렉산더. 제가 당황한 부분이 바로 그 부분입니다. 무엇을 할당해야 하나요? Calc_Pos(count_buy, countsell) 함수가 작동해야 하는 건가요, 아니면 제가 잘못 이해한 건가요?

안녕하세요, 블라디미르.

1. 두 개의 변수를 선언하고 초기화합니다.

uint count_buy=0, count_sell=0;

2. 그 값을 함수에 전달합니다.

Calc_Pos(count_buy,count_sell);


그런 다음 이 변수들의 값을 출력합니다. 하지만 각각
, 0이 출력되는 등 아무 것도 변경되지 않았습니다. 모든 것이 기록 된대로 작동합니다.

추신: 이 두 변수를 전역으로 선언할 수 있습니다.
예를 들어 다음과 같이요:

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

   uint pos_buy=0, pos_sell=0;  // это глобальные переменные

//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos()
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Calc_Pos();
   Print("По символу ",_Symbol," открыто: ",pos_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",pos_sell," коротких позиций");
  }
//+------------------------------------------------------------------+
 
Alexander Sevastyanov #:

1. 두 개의 변수를 선언하고 초기화합니다.

2. 해당 값을 함수에 전달합니다.


그런 다음 이 변수들의 값을 출력합니다. 하지만 각각
으로 변경되지 않았고 0으로 인쇄됩니다. 모든 것이 기록된 대로 작동합니다.

추신: 이 두 변수를 전역으로 선언할 수 있습니다.
예를 들어 다음과 같이요:

고마워요, 알렉산더. 수정 덕분에 코드가 작동합니다. 솔직히 말해서 저도 세 가지 소나무에서 혼란스러웠다는 것을 깨달았습니다. 함수에 인수를 전달하는 방법을 다시 공부해야겠습니다. 분명히 여기에 완전한 오해가 있습니다.

안부, 블라디미르.

사유: