Тоже самое. Закрывается позиция - устанавливается отложенный ордер и т.д. Функция, которая возвращает последнее значение (например OrderCloseTime()) имеется. С каждым тиком я получаю значение времени закрытия последней закрытой позиции (скажем позиция №1). При закрытии следующей позиции (позиция №2) с новым тиком я получаю время закрытия уже этой (№2) позиции. Значение OrderCloseTime() изменилось относительно предыдущего. И так далее. Мне не важно как и насколько изменилась переменная. Мне важен сам факт изменения переменной. Это как логическая операция: если OrderCloseTime() последней закрытой позиции больше чем OrderCloseTime() предпоследней, то сделать БЛА-БЛА-БЛА. Также - если OrderClosePrice() последней закрытой позиции не равно OrderClosePrice() предпоследней, то сделать БЛА-БЛА-БЛА. Или может нельзя провести такое сравнение?
Вот какой вопрос назрел. Допустим в советнике сигнал на покупку появляется, когда индикатор (для примера взял CCI) пересекает некий уровень (красная линия) снизу вверх, а сигнал на продажу когда соответственно когда сверху вниз. Как сделать так, чтобы во время формирования бара A ордер мог открыться только один раз? Т.е. допустим индикатор при формировании бара A несколько раз пересекает уровень (красная линия) то вниз, то вверх. Как я уже сказал нужно сделать так, чтобы при этом ордер открывался только один раз.
При этом надо чтобы при сигнале на продажу, который будет получен на баре D (ситуация 2 на графике) ордер, открытый на баре A не закрывался и вообще никак не затрагивался.
Т.е. после своего открытия ордера никак не контролируются советником.
Forrim: Вот какой вопрос назрел. Допустим в советнике сигнал на покупку появляется, когда индикатор (для примера взял CCI) пересекает некий уровень (красная линия) снизу вверх, а сигнал на продажу когда соответственно когда сверху вниз. Как сделать так, чтобы во время формирования бара A ордер мог открыться только один раз? Т.е. допустим индикатор при формировании бара A несколько раз пересекает уровень (красная линия) то вниз, то вверх. Как я уже сказал нужно сделать так, чтобы при этом ордер открывался только один раз.
При этом надо чтобы при сигнале на продажу, который будет получен на баре D (ситуация 2 на графике) ордер, открытый на баре A не закрывался и вообще никак не затрагивался.
Т.е. после своего открытия ордера никак не контролируются советником.
Заранее спасибо.
Вообще, CCI скачет так дико, что лучше проверять после того как Бар завершился и открылся новый.
Ну а если сильно важно по текущему, то при каждом пересечении надо запомнить время открытия свечи в глобальной переменной и потом проводить проверку, отличается ли время (если да то открывается ордер) или оно то же самое (=> не открывается ордер).
Forrim: Вот какой вопрос назрел. Допустим в советнике сигнал на покупку появляется, когда индикатор (для примера взял CCI) пересекает некий уровень (красная линия) снизу вверх, а сигнал на продажу когда соответственно когда сверху вниз. Как сделать так, чтобы во время формирования бара A ордер мог открыться только один раз? Т.е. допустим индикатор при формировании бара A несколько раз пересекает уровень (красная линия) то вниз, то вверх. Как я уже сказал нужно сделать так, чтобы при этом ордер открывался только один раз.
При этом надо чтобы при сигнале на продажу, который будет получен на баре D (ситуация 2 на графике) ордер, открытый на баре A не закрывался и вообще никак не затрагивался.
Т.е. после своего открытия ордера никак не контролируются советником.
Заранее спасибо.
Если позиция данного типа уже открыта, то больше не открывать.
//--------------------------------------------------------------- 1 --// Численные значения для М15externdouble StopLoss =20; // SL для открываемого ордераexterndouble TakeProfit =20; // ТР для открываемого ордераexterndouble Step_Sar=0.02; // Шаг Sarexterndouble Maximum_Sar=0.2; // Максимум Sarexterndouble Lot=0.01; // Жестко заданное колич. лотовbool Work=true; // Эксперт будет работать.//--------------------------------------------------------------- 2 --int start()
{
int
Total, // Количество ордеров в окне
Ticket; // Номер ордераdouble
Sar_1 , // Значен. Sar текущее
Sar_0 , // Значение Sar предыдущей свечки
Price, // Цена ордера
SL, // SL ордера
TP; // TP ордераbool
Ans =false, // Ответ сервера после закрытия
Cls_B=false, // Критерий для закрытия Buy
Cls_S=false, // Критерий для закрытия Sell
Opn_B=false, // Критерий для открытия Buy
Opn_S=false; // Критерий для открытия Sell//--------------------------------------------------------------- 3 -- // Учёт ордеров
Total=0; // Количество ордеровfor(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:if (OrderSymbol()!=Symbol())continue; // Не наш фин. инструмif (OrderType()>1) // Попался отложенный
{
Alert("Обнаружен отложенный ордер. Эксперт не работает.");
return; // Выход из start()
}
Total++; // Счётчик рыночн. ордif (Total>1) // Не более одного орд
{
Alert("Несколько рыночных ордеров. Эксперт не работает.");
return; // Выход из start()
}
Price =OrderOpenPrice(); // Цена выбранн. орд.
SL =OrderStopLoss(); // SL выбранного орд.
TP =OrderTakeProfit(); // TP выбранного орд.
Lot =OrderLots(); // Количество лотов
}
}
//--------------------------------------------------------------- 6 --// Торговые критерии
Sar_1=iSAR(NULL, 0, 0.02, 0.2, 1); // Sar_1
Sar_0=iSAR(NULL, 0, 0.02, 0.2, 0); // Sar_0if (Sar_0 > Price && Sar_1 < Price) // если Sar меняет положение
{
Opn_B=true; // Критерий откр. Buy
}
if (Sar_0 < Price && Sar_1 > Price) // если Sar меняет положение
{
Opn_S=true; // Критерий откр. Sell
}
//--------------------------------------------------------------- 7 --
{
if (Opn_B==true)
{ // критерий откр. Buy
RefreshRates(); // Обновление данных
SL=(20+Ask-Bid)*Bid; // Вычисление SL откр.
TP=20*Bid; // Вычисление TP откр.Alert("Попытка открыть Buy. Ожидание ответа..");
Ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,0,SL,TP);//Открытие Buy
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокreturn; // Выход из start()if (Opn_S==true) // критерий откр. Sell
{ // критерий откр. Sell
RefreshRates(); // Обновление данных
SL=(20+Ask-Bid)*Ask; // Вычисление SL откр.
TP=20*Ask; // Вычисление TP откр.Alert("Попытка открыть Sell. Ожидание ответа..");
Ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,0,SL,TP);//Открытие Selreturn; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокreturn; // Выход из start()
}
//--------------------------------------------------------------- 9 --return; // Выход из start()
}
//-------------------------------------------------------------- 10 --int Fun_Error(int Error) // Ф-ия обработ ошибок
{
switch(Error)
{ // Преодолимые ошибки case4: Alert("Торговый сервер занят. Пробуем ещё раз..");
Sleep(3000); // Простое решениеreturn(1); // Выход из функцииcase135:Alert("Цена изменилась. Пробуем ещё раз..");
RefreshRates(); // Обновим данныеreturn(1); // Выход из функцииcase136:Alert("Нет цен. Ждём новый тик..");
while(RefreshRates()==false) // До нового тикаSleep(1); // Задержка в циклеreturn(1); // Выход из функцииcase137:Alert("Брокер занят. Пробуем ещё раз..");
Sleep(3000); // Простое решениеreturn(1); // Выход из функцииcase146:Alert("Подсистема торговли занята. Пробуем ещё..");
Sleep(500); // Простое решениеreturn(1); // Выход из функции// Критические ошибкиcase2: Alert("Общая ошибка.");
return(0); // Выход из функцииcase5: Alert("Старая версия терминала.");
Work=false; // Больше не работатьreturn(0); // Выход из функцииcase64: Alert("Счет заблокирован.");
Work=false; // Больше не работатьreturn(0); // Выход из функцииcase133:Alert("Торговля запрещена.");
return(0); // Выход из функцииcase134:Alert("Недостаточно денег для совершения операции.");
return(0); // Выход из функцииdefault: Alert("Возникла ошибка ",Error); // Другие варианты return(0); // Выход из функции
}
}
//-------------------------------------------------------------- 11 --
Элементарный советник, должен открывать позиции при смене положения индикатора Parabolic SAR относительно графика цены, работает на M15, SL и TP всегда постоянны для открываемой позиции.
Советник сравнивает положения индикатора текущей и предыдущей свечек.
При компиляции ошибок и замечаний нет, при тестировании во вкладках "результаты" "график" "отчет" пусто, в журнале вот это:"картинка"
За кодингом 2ой день, никогда этим раньше не занимался, книгу по mql прочитал, в инете свою проблему поискал. Я в тупике, помогите, если не трудно
А в следующий раз что изменится?
При этом надо чтобы при сигнале на продажу, который будет получен на баре D (ситуация 2 на графике) ордер, открытый на баре A не закрывался и вообще никак не затрагивался.
Т.е. после своего открытия ордера никак не контролируются советником.
Заранее спасибо.
Помогите, пожалуста, прикрутить к эксперту кусочек кода Секвента Демарка https://www.mql5.com/ru/code/7372
вот так не роботает:
num=0:
for(i=bars; i>=0; i--)
{
if ((iClose(NULL,PERIOD_M5,i+1)<iClose(NULL,PERIOD_M5,i+4) && num!=0 )) {
num++;
if ((iClose(NULL,PERIOD_M5,i+1)<iClose(NULL,PERIOD_M5,i+4))
buy.......
if (num==9)
close........
1. Сосчитать количество оредров первого типа
2. Сосчитать количество ордеров второго типа
3. Сравнить результаты
Уважаемый Vinin. Большое Вам спасибо!
Вот какой вопрос назрел. Допустим в советнике сигнал на покупку появляется, когда индикатор (для примера взял CCI) пересекает некий уровень (красная линия) снизу вверх, а сигнал на продажу когда соответственно когда сверху вниз. Как сделать так, чтобы во время формирования бара A ордер мог открыться только один раз? Т.е. допустим индикатор при формировании бара A несколько раз пересекает уровень (красная линия) то вниз, то вверх. Как я уже сказал нужно сделать так, чтобы при этом ордер открывался только один раз.
При этом надо чтобы при сигнале на продажу, который будет получен на баре D (ситуация 2 на графике) ордер, открытый на баре A не закрывался и вообще никак не затрагивался.
Т.е. после своего открытия ордера никак не контролируются советником.
Заранее спасибо.
Вообще, CCI скачет так дико, что лучше проверять после того как Бар завершился и открылся новый.
Ну а если сильно важно по текущему, то при каждом пересечении надо запомнить время открытия свечи в глобальной переменной и потом проводить проверку, отличается ли время (если да то открывается ордер) или оно то же самое (=> не открывается ордер).
Вот какой вопрос назрел. Допустим в советнике сигнал на покупку появляется, когда индикатор (для примера взял CCI) пересекает некий уровень (красная линия) снизу вверх, а сигнал на продажу когда соответственно когда сверху вниз. Как сделать так, чтобы во время формирования бара A ордер мог открыться только один раз? Т.е. допустим индикатор при формировании бара A несколько раз пересекает уровень (красная линия) то вниз, то вверх. Как я уже сказал нужно сделать так, чтобы при этом ордер открывался только один раз.
При этом надо чтобы при сигнале на продажу, который будет получен на баре D (ситуация 2 на графике) ордер, открытый на баре A не закрывался и вообще никак не затрагивался.
Т.е. после своего открытия ордера никак не контролируются советником.
Заранее спасибо.
Элементарный советник, должен открывать позиции при смене положения индикатора Parabolic SAR относительно графика цены, работает на M15, SL и TP всегда постоянны для открываемой позиции.
Советник сравнивает положения индикатора текущей и предыдущей свечек.
При компиляции ошибок и замечаний нет, при тестировании во вкладках "результаты" "график" "отчет" пусто, в журнале вот это:"картинка"
За кодингом 2ой день, никогда этим раньше не занимался, книгу по mql прочитал, в инете свою проблему поискал. Я в тупике, помогите, если не трудно
T.H.C.,попробуй так
T.H.C.,попробуй так
Спасибо огромное,не ожидал такой оперативности, да и таких изменений в коде.
Насоветуй пжалста еще книг по программированию, кроме базовой mql
Спасибо огромное,не ожидал такой оперативности, да и таких изменений в коде.
Насоветуй пжалста еще книг по программированию, кроме базовой mql