Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 1478

 
MrBrooklin #:

Tam olarak neyi anlamadınız? Bir EA başlatma işlevi nasıl oluşturulur? O zaman yeni başlayanlar için bu makaleyi incelemeye çalışın.

Saygılarımla, Vladimir.

ve başlatmanın ne anlama geldiği))))) bir kişi için açık değildir)))))

 
Valeriy Yastremskiy #:

ve initialise ile ne demek istiyorsunuz))))) bu kişi için biraz belirsiz)))))

İyi akşamlar, Valery! Kişiye önerilen makaleyi açıyoruz ve orada önce kısa bir açıklama buluyoruz:

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

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

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

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

ve sonra daha ayrıntılı bir tane:

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(),"!!");
     }

Genel olarak, en azından önce bu makaleyi okumalıdır. ))

Saygılarımla, Vladimir.

 

Herkese iyi günler!

Kendi kendime çalışmaya devam ediyorum ve yine bir karışıklıkla karşılaştım. İşte script kodu:

//+------------------------------------------------------------------+
//| 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);
     }
  }
//+------------------------------------------------------------------+

Kodun segment olarak bir trend çizgisi çizmesi gerekiyordu. Bunu yapmak için, bu segmenti çizmek üzere ilk ve ikinci noktayı ayarladım. Belgeler ayrıca bir trend çizgisi oluşturmak için iki bağlantı noktasına ihtiyacınız olduğunu söylüyor. Her şeyi yapılması gerektiği gibi yaptığımı düşünüyorum. Anladığım kadarıyla, ikinci nokta da bir uç nokta, ancak nedense bir segment değil, bir ışın çiziliyor.


Lütfen bana nerede hata yaptığımı söyleyebilir misiniz?

Saygılarımla, Vladimir.

 

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 #:

Teşekkürler, Artyom! Dostum, bu kadar basit ve açık bir şeyi anlayacak kadar zekam yokmuş. Tanrı sizi korusun!

Saygılarımla, Vladimir.

 

Herkese günaydın ve iyi günler!

İşte bu kadar! "Geliyorum, çatınız!" Bu benim. Senaryoyu çalıştırdım:

//+------------------------------------------------------------------+
//|                                              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," коротких позиций");
  }
//+------------------------------------------------------------------+

ve bunu alıyorum:

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 коротких позиций

ve iki kısa pozisyon olmalı. Lütfen bana nerede hata yaptığımı söyleyebilir misiniz?

Saygılarımla, Vladimir.

 
MrBrooklin #:

Herkese günaydın ve iyi günler!

İşte bu kadar! "Geliyorum, çatınız!" Bu benim. Senaryoyu ben yazıyorum:

ve bunu anladım:

ve iki kısa pozisyon olmalı. Lütfen bana nerede hata yaptığımı söyleyebilir misiniz?

Saygılarımla, Vladimir.

Son iki baskı

değişkenlerin değerlerinin çıktısını alıyor

uint count_buy=0, count_sell=0;

başlatıldı, ancak bunlara daha fazla bir şey atanmadı.
Yani her şey yazıldığı gibi çalışıyor - mucize yok.

 
Alexander Sevastyanov #:

Son iki baskı

değişkenlerin değerini çıktı olarak verir

başlatıldı, ancak bunlara daha fazla bir şey atanmadı.
Yani her şey yazıldığı gibi çalışıyor - mucize yok.

Merhaba, Alexander. İşte burada tıkandım. Ne atanmalı? Sanırım Calc_Pos(count_buy, countsell) fonksiyonu çalışmalı, yoksa yanlış mı anlıyorum?

Saygılarımla, Vladimir.

 
MrBrooklin #:

Merhaba, Alexander. İşte burada tıkandım. Ne atanması gerekiyor? Sanırım Calc_Pos(count_buy, countsell) fonksiyonu çalışmalı, yoksa yanlış mı anlıyorum?

Saygılarımla, Vladimir.

1. İki değişken tanımlıyor ve başlatıyorsunuz.

uint count_buy=0, count_sell=0;

2. Bunların değerlerini fonksiyona aktarırsınız.

Calc_Pos(count_buy,count_sell);

Bunun neden yapıldığı tam olarak açık değildir.
Daha sonra bu değişkenlerin değerlerinin çıktısını alırsınız. Ancak hiçbir yerde değiştirilmemişlerdir, sırasıyla
ve sıfırlar yazdırılır. Her şey yazıldığı gibi çalışıyor.

Not: Planınızı anlamaya çalışıyorum: bu iki değişkeni global olarak bildirebilirsiniz.
Örneğin, şu şekilde:

//+------------------------------------------------------------------+
//|                                              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. İki değişken tanımlıyor ve başlatıyorsunuz.

2. Bunların değerlerini fonksiyona aktarırsınız.

Bunun neden yapıldığı tam olarak açık değildir.
Daha sonra bu değişkenlerin değerlerinin çıktısını alın. Ancak hiçbir yerde değiştirilmemişlerdir, sırasıyla
ve sıfırlarla yazdırılırlar. Her şey yazıldığı gibi çalışır.

Not: Planınızı anlamaya çalışıyorum: bu iki değişkeni global olarak bildirebilirsiniz.
Örneğin, şu şekilde:

Çok teşekkür ederim, Alexander. Düzeltmeniz kodun çalışmasını sağladı. Dürüst olmak gerekirse, ben de üç çamda kafamın karıştığını fark ettim. Bir fonksiyona argüman geçirme konusunu tekrar çalışmam gerekiyor. Görünüşe göre, burada tamamen yanlış anlamışım.

Saygılarımla, Vladimir.