ArrayMaximum/ArrayMinimumЭтой функцией я пользовался.. Но мне нужно более универальное решение. Чтобы можно было вместо хая бара подставить, например, значение какого-то расчёта. Поэтому я и ищу решение альтернативное.
_http://forum.mql4.com/ru/57685Но стрелки то рисуются не там где нужно. Почему? Я вообще в шоке :facepalm:. Пишу вещи на порядок сложнее в логике, но индикаторов не писал раньше. И вот застрял на этом месте... Просьба направить в требуемом направлении..
double buf_1[];
double buf_2[];
...
int init() {
SetIndexBuffer(0, buf_1);
SetIndexBuffer(1, buf_2);
//---- Стиль исполнения графика
//---- DRAW_ARROW - стрелки(символы)
SetIndexStyle (0, DRAW_ARROW, STYLE_SOLID, 3);
SetIndexStyle (1, DRAW_ARROW, STYLE_SOLID, 3);
SetIndexArrow (0, 233);
SetIndexArrow (1, 234);
//---- установка значений индикатора, которые не будут видимы на графике
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
...
int start() {
...
//---- проверка условий по вашим правилам и отрисовка стрелки
if (MA_Fast_1 > MA_Slow_1 && MA_Fast_2 <= MA_Slow_2) buf_1[i+1] = Low[i+1] - 10 * Point;
if (MA_Fast_1 < MA_Slow_1 && MA_Fast_2 >= MA_Slow_2) buf_2[i+1] = High[i+1] + 10 * Point;
...
Нашёл проблему. ) На реальных счётах, где на протяжении всей его жизни менялся баланс, плюс, 0, плюс, 0, вот этот код начинает не корректно работать. А именно на сколько я понял, как только цена касается отложки, и даже если прибыль в 0 и выше, тут же исполняется условие. Во как.
if (AccountEquity()>=AccountBalance()+AccountBalance()/100*PercentProfit)
{Close_all();
}
как только убираю этот код, закрытие не происходит и бот работает дальше.
Так как же будет выглядеть правильно закрытие всего по проценту прибыли Эквити.
ArrayMaximum/ArrayMinimum
_http://forum.mql4.com/ru/57685
Код:double buf_1[]; double buf_2[]; ... int init() { SetIndexBuffer(0, buf_1); SetIndexBuffer(1, buf_2); //---- Стиль исполнения графика //---- DRAW_ARROW - стрелки(символы) SetIndexStyle (0, DRAW_ARROW, STYLE_SOLID, 3); SetIndexStyle (1, DRAW_ARROW, STYLE_SOLID, 3); SetIndexArrow (0, 233); SetIndexArrow (1, 234); //---- установка значений индикатора, которые не будут видимы на графике SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0); ... int start() { ... //---- проверка условий по вашим правилам и отрисовка стрелки if (MA_Fast_1 > MA_Slow_1 && MA_Fast_2 <= MA_Slow_2) buf_1[i+1] = Low[i+1] - 10 * Point; if (MA_Fast_1 < MA_Slow_1 && MA_Fast_2 >= MA_Slow_2) buf_2[i+1] = High[i+1] + 10 * Point; ...
Привет, Виктор. Я даже и не подумал что здесь -http://forum.mql4.com/ru/69388 это твоя тема.Этой функцией я пользовался.. Но мне нужно более универальное решение. Чтобы можно было вместо хая бара подставить, например, значение какого-то расчёта. Поэтому я и ищу решение альтернативное.
Согласен. Буфер MaxSize, на данный момент, не используется. Но лишь потому, что мне нада написать условие, чтоб стрелка рисовалась после 3 увеличивающихся хаём баров. А дальше уже займусь передачей в буфер данных.
На данный момент, вся логика просто:
Но стрелки то рисуются не там где нужно. Почему? Я вообще в шоке :facepalm:. Пишу вещи на порядок сложнее в логике, но индикаторов не писал раньше. И вот застрял на этом месте... Просьба направить в требуемом направлении..PHP://+---------------------------------------------------------------------------------------------------------------------------------------+//| Определение наличия увеличивающегося размера бара |//+---------------------------------------------------------------------------------------------------------------------------------------+bool ExistencePositiveSequence (int fi_Index){ if (High[fi_Index] > High[fi_Index - 1]) { sequenceCount++; return (true); } sequenceCount = 0; return (false);}//+---------------------------------------------------------------------------------------------------------------------------------------+//| 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 limit = rates_total - prev_calculated; if (prev_calculated == 0) limit--; else limit++; for (int i = 0; i < limit; i++) { if (ExistencePositiveSequence (i) == true) { if (sequenceCount == 3) CDraw.DrawObject (_Symbol, _Period, OBJ_ARROW_UP, i, Time[i], Open[i]); } } return (rates_total);
Если через буфер я понимаю. Но это всё можно и без буфера реализовать. Почему нет? Вы этого не понимаете тоже?
Ведь буфер тут нет необходимости заводить т.к. хранить информацию не нужно.
Выполнилось условие - создали объект! Выполнилось ещё раз условие - создали объект! И т.д. Объекты не удаляются в процессе выполнения программы. Логично?
Тогда должно и так работать? В чём загвоздка?
Использование SetIndexBuffer не наталкивает на размышления?Если через буфер я понимаю. Но это всё можно и без буфера реализовать. Почему нет? Вы этого не понимаете тоже?
Ведь буфер тут нет необходимости заводить т.к. хранить информацию не нужно.
капец! тут чего нет специалистов
всё прекрасно работает, кроме одного - при инициализации сова сначала срабатывает закрытие ордеров. :facepalm:
для определения пересечения мувинга написал функцию Proverka, в которой обьявил статические переменные last и current и присвоил значение ноль. функция передаёт значение 1 или 2 при пересечении цены мувинга, при инициализации сова должно передаваться значении 0, но походу это не так и ордера как уже и написал закрываются..
Чтобы избежать этой ошибки добавьте проверку значения индюка
if ( значение индюка > 0 && значение индюка < 100000 )
А ты попробуй посчитать вручную что возвращает твоя функция int Proverka (double znah1 , double znah2) при первом обращении к ней.добавил.. к сожалению - без изменений. :disappointed:
Вот это самое "очень большое значение" называется EMPTY_VALUE (пустое значение). Тогда получается правильное сравнениеОшибки такого рода происходят из-за того, что при инициализации сова не сразу выдаются точные показания вызываемых индюков - т.е. до полной инициализации индюка его значение может быть равным нулю или очень большому значению ( значительно больше значения цены). Чтобы избежать этой ошибки добавьте проверку значения индюка
if ( значение индюка > 0 && значение индюка < 100000 )
здравствуйте. ребята, может кто то подскажет мне в одном вопросе. склепал советник, который закрывает ордера, с минимальным профитом n-пунктов при пересечении мувинга с низу вверх или с верху вниз. всё прекрасно работает, кроме одного - при инициализации сова сначала срабатывает закрытие ордеров. :facepalm:
для определения пересечения мувинга написал функцию Proverka, в которой обьявил статические переменные last и current и присвоил значение ноль. функция передаёт значение 1 или 2 при пересечении цены мувинга, при инициализации сова должно передаваться значении 0, но походу это не так и ордера как уже и написал закрываются..
заранее буду благодарен, если поможете подрихтовать. оО
код прилагаю.
iProverka=Proverka(MA,BA); // Проверка прохода через машку
if(iProverka == 1 || iProverka == 2)
{
for (int i=OrdersTotal()-1; i>=0; i--)
{OrderSelect(i,SELECT_BY_POS,MODE_TRADES); // выбор ордера
if (OrderType()==OP_BUY && OrderSymbol()==Symbol()) // проверка инструмента
{
point=MarketInfo(OrderSymbol(),MODE_POINT);
if (point==0) break;
bid=MathRound(MarketInfo(OrderSymbol(),MODE_BID)/point);
open=MathRound(OrderOpenPrice()/point);
if (bid-open<Profit) continue;
OrderClose(OrderTicket(),OrderLots(),bid*point,slippage);
}
if (OrderType()==OP_SELL&& OrderSymbol()==Symbol())
{
point=MarketInfo(OrderSymbol(),MODE_POINT);
if (point==0) break;
ask=MathRound(MarketInfo(OrderSymbol(),MODE_ASK)/point);
open=MathRound(OrderOpenPrice()/point);
if (open-ask<Profit) continue;
OrderClose (OrderTicket(),OrderLots(),ask*point,slippage);
}
}
}
if (OrderType()==OP_BUY && OrderSymbol()==Symbol())
if (OrderType()==OP_BUY && OrderSymbol()==Symbol())
if (bid-open<Profit) continue;
if (bid-open<Profit * ПУНКТ) continue;
Вот это самое "очень большое значение" называется EMPTY_VALUE (пустое значение). Тогда получается правильное сравнение
значение индюка != EMPTY_VALUE
Нет, в этом ты не прав. Индикатор при запросе возвращает то, что содержится в запрашиваемом буфере на том баре который нас интересует. Соответственно если там пустое значение, то и получим мы пустое значение.Если индюк возвратил значение, то па факту оно не будет "пустым".
Привет, Виктор. Я даже и не подумал что здесь -http://forum.mql4.com/ru/69388 это твоя тема.
К коду много вопросов. Например, зачем рисовать стрелки если можно загнать их в буфер такими-же стрелками. Но это фигня учитывая неопытность написания индикаторов.
На мой взгляд лучше строить цикл на уменьшение номера бара
for (int i = limit; i >= 0; i--)
Потом я-бы подсчёт количества баров поставил-бы в функцию ExistencePositiveSequence и соответственно или return(true) или обнуление переменной sequenceCount если после двух, например или даже одного раза выполнения условия вдруг нарушение и надо начинать подсчёт с начала...