Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 219
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Я всегда знал что она содержит количество ордеров -1, то есть OrdersTotal()-1 и всё работало, но стал писать программу и вдруг, один ордер перестал учитываться, запросил OrdersTotal() и он выдал общее кол-во ордеров = 3, а не 3-1.
Что происходит?
Обычный вид цикла в справке:
int total=OrdersTotal();
for(int pos=0;pos<total;pos++)
{
}
То есть первый ордер идёт как нулевое значение.
Но по факту нет, первый ордер и идёт как 1, значит перебор надо начинать с единицы, а не с нуля?
Метаквоты что-то начудили, или я туплю?
Здравствуйте, что с OrdersTotal()?
Я всегда знал что она содержит количество ордеров -1, то есть OrdersTotal()-1 и всё работало, но стал писать программу и вдруг, один ордер перестал учитываться, запросил OrdersTotal() и он выдал общее кол-во ордеров = 3, а не 3-1.
Что происходит?
Обычный вид цикла в справке:
int total=OrdersTotal();
for(int pos=0;pos<total;pos++)
{
}
То есть первый ордер идёт как нулевое значение.
Но по факту нет, первый ордер и идёт как 1, значит перебор надо начинать с единицы, а не с нуля?
Метаквоты что-то начудили, или я туплю?
Вы смешали в кучу ОТЛОЖЕННЫЕ ОРДЕРА и ПОЗИЦИИ. Прочтите справку. Сформилуйте точнее свой вопрос: что именно Вы пытаетесь посчитать: ОТЛОЖЕННЫЕ ОРДЕРА или ПОЗИЦИИ? И таки да, ничего не изменилось - первый индекс элемента начинается с '0'.
ДОбавлено: пример
Example: Calculate Positions and Pending Orders
Вы смешали в кучу ОТЛОЖЕННЫЕ ОРДЕРА и ПОЗИЦИИ. Прочтите справку. Сформилуйте точнее свой вопрос: что именно Вы пытаетесь посчитать: ОТЛОЖЕННЫЕ ОРДЕРА или ПОЗИЦИИ? И таки да, ничего не изменилось - первый индекс элемента начинается с '0'.
ДОбавлено: пример
Example: Calculate Positions and Pending Orders
Я имею ввиду MQL4, а не MQL5, тут нет разделения на отложки и рыночные!
Я имею ввиду MQL4, а не MQL5, тут нет разделения на отложки и рыночные!
Вы пишите на форуме MQl5. Вы пишете в основном разделе. Вы пишите в теме о MQL5 - естественно ответы получаете про MQL5.
Вопросы по старому терминалу задаются в специальном разделе: MQL4 и MetaTrader 4. Впредь пишите там. Ваши вопросы перенесу.
Вот я сравнил два варианта, в первом применил OrdersTotal()-1 и начал перебор с нуля - получил ошибку
Во втором варианте начал с единицы и взял целиком OrdersTotal(), - ошибки нет в этот раз
Смотрите скрины, там видно что OrdersTotal() отображает фактическое кол-во ордеров, а не OrdersTotal()-1 ...
Вопрос, почему OrdersTotal() выдаёт точное количество ордеров, а не -1, так и должно быть или это что то новое?
Ведь в этом случае, перебор надо начинать не с нуля, а с единицы!
Вот я сравнил два варианта, в первом применил OrdersTotal()-1 и начал перебор с нуля - получил ошибку
Во втором варианте начал с единицы и взял целиком OrdersTotal(), - ошибки нет в этот раз
Смотрите скрины, там видно что OrdersTotal() отображает фактическое кол-во ордеров, а не OrdersTotal()-1 ...
Вопрос, почему OrdersTotal() выдаёт точное количество ордеров, а не -1, так и должно быть или это что то новое?
Ведь в этом случае, перебор надо начинать не с нуля, а с единицы!
Кажется я понял свою ошибку сорри...
В этом условии идёт смещение на -1:
if (OrderSelect(i-1,SELECT_BY_POS)==true){}
Извините за тупость, взял строку из другой программы и не обратил внимание на смещение!
//+------------------------------------------------------------------+ //| MSBB.mq4 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #include <MovingAverages.mqh> #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 clrGreen #property indicator_color2 clrRed #property indicator_width1 1 input int InpMSBBPeriod=3; // Period input ENUM_MA_METHOD InpMSBBMethod=MODE_SMA; // Method //--- indicator buffers double ExtMSBBBuffer[]; double ExtTempBuffer[]; double ExtPriceBuffer[]; double ExtSignalBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit(void) { //--- indicator buffers mapping IndicatorDigits(Digits-2); //--- drawing settings IndicatorBuffers(4); SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexBuffer(0,ExtMSBBBuffer); SetIndexBuffer(1,ExtSignalBuffer); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(2,ExtTempBuffer); SetIndexBuffer(2,ExtPriceBuffer); SetIndexDrawBegin(1,InpMSBBPeriod); //--- name for DataWindow and indicator subwindow label IndicatorShortName("MSBB("+IntegerToString(InpMSBBPeriod)+")"); SetIndexLabel(0,"MSBB"); SetIndexLabel(1,"Signal"); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 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[]) { int i;//limit; //------ if(rates_total<=InpMSBBPeriod || InpMSBBPeriod<=2) return(0); /*//--- counting from 0 to rates_total ArraySetAsSeries(ExtMSBBBuffer,false); ArraySetAsSeries(ExtSignalBuffer,false); ArraySetAsSeries(open,false); ArraySetAsSeries(high,false); ArraySetAsSeries(low,false); ArraySetAsSeries(close,false);*/ //--- // limit=rates_total-prev_calculated; //if(prev_calculated>0) // limit++; //--- typical price and its moving average for(i=0; i<rates_total; i++) { ExtTempBuffer[i] = NormalizeDouble((close[i]-open[i])/Point(),2); ExtPriceBuffer[i] = NormalizeDouble((close[i+1]-open[i+1])/Point(),2); //ExtMSBBBuffer[i]=price_open+ExtTempBuffer[i]; //Print("ExtPriceBuffer[i] = ", ExtPriceBuffer[i]); if(ExtTempBuffer[i]==0) ExtMSBBBuffer[i]=0.0; if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]>0) { double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2); double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2); if((price_open<0 && price_close>0)||(price_open>0 && price_close<0)) ExtMSBBBuffer[i] = 0.0; if((price_open<0 && price_close<0)||(price_open>0 && price_close>0)) ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open; } if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]<0) { double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2); double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2); if((price_open<0 && price_close>0)||(price_open>0 && price_close<0)) ExtMSBBBuffer[i] = 0.0; if((price_open>0 && price_close>0)||(price_open<0 && price_close<0)) ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open; } if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]<0) { double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2); double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2); if((price_open<0 && price_close>0)||(price_open>0 && price_close<0)) ExtMSBBBuffer[i]=0.0; if((price_open<0 && price_close<0)||(price_open>0 && price_close>0)) ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open; } if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]>0) { double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2); double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2); if((price_open>0 && price_close<0)||(price_open<0 && price_close>0)) ExtMSBBBuffer[i]=0.0; if((price_open>0 && price_close>0)||(price_open<0 && price_close<0)) ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open; } //--- signal line counted in the 2-nd buffer //ExtSignalBuffer[i]=iMAOnArray(ExtMSBBBuffer,0,InpMSBBPeriod,0,InpMSBBMethod,0); SimpleMAOnBuffer(rates_total,prev_calculated,1,InpMSBBPeriod+2,ExtMSBBBuffer,ExtSignalBuffer); Print ("ExtSignalBuffer = ", ExtSignalBuffer[i]); //--- done } /* if(ExtPriceBuffer[i]>0||ExtPriceBuffer[i]<0) { ExtMSBBBuffer[i] = ExtPriceBuffer[i]+ExtTempBuffer[i]; Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]); } if(ExtPriceBuffer[i]==0) { ExtMSBBBuffer[i] = 0.0; Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]); } }*/ //--- //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+