double MaxCloseHourPrice=0; double MinCloseHourPrice=DBL_MAX; for(int i=24; i>0; i--) { if (iClose(NULL,PERIOD_H1,Hour()+i)>MaxCloseHourPrice) MaxCloseHourPrice=iClose(NULL,PERIOD_H1,Hour()+i); if (iClose(NULL,PERIOD_H1,Hour()+i)<MinCloseHourPrice) MinCloseHourPrice=iClose(NULL,PERIOD_H1,Hour()+i); }
}
Максимум показывает нормально, а вот минимум по нулям вечно, подскажите, пожалуйста
Еще могу добавить, чтобы более понятно было. Дело в том, что MinCloseHourPrice изначально инициализируется нулем. То есть с учетом того, что цена всегда имеет положительное число, условие
if (iClose(NULL,PERIOD_H1,Hour()+i)<MinCloseHourPrice)
никогда не сработает. Поэтому нужно инициализировать MinCloseHourPrice=DBL_MAX; максимальным числом, которого никогда не будет в ценовом ряде Close.
Показывать стал, но теперь график в тестере стоит на месте
Показывать стал, но теперь график в тестере стоит на месте
Покажите весь код, так Вам сложно будет сказать в чем причина. И используйте кнопку "SRC" для выделения кода.
Покажите весь код, так Вам сложно будет сказать в чем причина. И используйте кнопку "SRC" для выделения кода.
//--- input parameter input int InpAtrPeriod=14; // ATR Period ///////////////////////////////////////////////////////////////////////////// extern double Lot = 0.5; extern int StopLoss; extern int TakeProfit; double ClosePrice = iClose(Symbol(), PERIOD_H1, 0); int Slippage = 3; int Magic = 111; int ticket; double SL, TP, a, MaxCloseHourPrice = 0, MinCloseHourPrice = DBL_MAX; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit(void) { if(Digits == 3 || Digits == 5) { TakeProfit *= 10; StopLoss *= 10; Slippage *= 10; } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // Определение максимальной и минимальной цены закрытия за предыдущий день часового бара // for(int i=24; i>0; i--) { if (iClose(NULL,PERIOD_H1,Hour()+i)>MaxCloseHourPrice) MaxCloseHourPrice=iClose(NULL,PERIOD_H1,Hour()+i); if (iClose(NULL,PERIOD_H1,Hour()+i)<MinCloseHourPrice) MinCloseHourPrice=iClose(NULL,PERIOD_H1,Hour()+i); } ////////////////////////////////////////////////////////////////////////////////// // ATR // Среднее значение // double ATR=iATR(NULL, 0, InpAtrPeriod, 0); double max=-10000, min=10000; for(int n=0; n<WindowFirstVisibleBar();n++) { ATR=iATR(NULL, 0, InpAtrPeriod, n); if(max<ATR)max=ATR; if(min>ATR)min=ATR; } min-=0.0001; max+=0.0001; a = (min + max) / 2; ObjectDelete(0,"MidLine"); ObjectCreate(0,"MidLine",OBJ_HLINE,1,Time[1], a); ////////////////////////////////////////////////////////////////////////// // Выполнение ордеров // if(ClosePrice > MaxCloseHourPrice && ATR > a && OrdersTotal() < 1) { ticket = OrderSend(Symbol(), OP_BUY, Lot, Ask, Slippage, 0, 0, "", Magic, 0, Green); if(ticket > 0) { SL = NormalizeDouble(Ask - StopLoss*Point, Digits); TP = NormalizeDouble(Ask + TakeProfit*Point, Digits); } if(OrderSelect(ticket, SELECT_BY_TICKET)) if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0)) Print("Ошибка модификации ордера на покупку"); } if(ClosePrice < MinCloseHourPrice && ATR > a && OrdersTotal() < 1) { ticket = OrderSend(NULL, OP_SELL, Lot, Bid, Slippage, 0, 0, "", Magic, 0, Red); if(ticket > 0) { SL = NormalizeDouble(Bid + StopLoss*Point, Digits); TP = NormalizeDouble(Bid - TakeProfit*Point, Digits); } if(OrderSelect(ticket, SELECT_BY_TICKET)) if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0)) Print("Ошибка модификации ордера на продажу"); } Comment("min = ", DoubleToStr(min,4), " max = ", DoubleToString(max,4) + "\n" + DoubleToStr(MaxCloseHourPrice) + "\n" + DoubleToStr(MinCloseHourPrice)); } //+------------------------------------------------------------------+ //////////////////////////////////////////////////////////////////////
Максимум показывает нормально, а вот минимум по нулям вечно, подскажите, пожалуйста
for(int i=23; i<48; i++) { double price=iClose(NULL,PERIOD_H1,i); if (price>MaxCloseHourPrice) MaxCloseHourPrice=price; if (price<MinCloseHourPrice) MinCloseHourPrice=price; }
Начнем сначала: "Определение максимальной и минимальной цены закрытия за предыдущий день часового бара".
Что Вы подразумеваете, нужно найти максимум и минимум в прошлом дне на такой же час, как в текущий?
Начнем сначала: "Определение максимальной и минимальной цены закрытия за предыдущий день часового бара".
Что Вы подразумеваете, нужно найти максимум и минимум в прошлом дне на такой же час, как в текущий?
В прошлом дне, но я использовал сдвиг на 24 свечи, там нужно будет додумать, чтобы робот независимо когда включался и находил всегда верный максимум и минимум закрытия, это уже потом. Имелось ввиду найти максимум и минимум закрытия часовой свечи за предыдущий день
{
}
У вас минималька не совсем правильно определяется цена всегда выше 0, поэтому данную проверку нужно ставить.
P.S. Чтоб не проводить лишнюю проверку, проще сделать так
double SL, TP, a, MaxCloseHourPrice = MinCloseHourPrice = iClose(NULL,PERIOD_H1,0);
Не подходит
Не подходит
используйте свой первоначальный код, но поставьте инициализацию переменных в начале цикла
MaxCloseHourPrice=0; MinCloseHourPrice=DBL_MAX;но это не "последний день", а последние 24 свечи
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Максимум показывает нормально, а вот минимум по нулям вечно, подскажите, пожалуйста