Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Цитата

А если у Вас работает ещё один советник на счёте? и два последних ордера чужие?



Сначала по меджику фильтровать наверное, потом цикл

Мне еще интересна вещь одна... а можно ли ордер сделать как бы виртуальным?
То есть выполнились условия для открытия, но первый раз ордер не открываем, а второй раз уже можно.
У меня есть идея, но может проще как можно...
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано


Сначала по меджику фильтровать наверное, потом цикл


Да, но мы-то говорим о OrdersHistoryTotal() - эта функция фильтровать не умеет.
Цитата


Мне еще интересна вещь одна... а можно ли ордер сделать как бы виртуальным?

Чего-ж проще - после выполнения условий сохраняйте цену, а потом от этой цены рассчитывайте СЛ или ТП...
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Цитата

Да, но мы-то говорим о OrdersHistoryTotal() - эта функция фильтровать не умеет.



А выход какой-нибудь есть?
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Цитата

Да, но мы-то говорим о OrdersHistoryTotal() - эта функция фильтровать не умеет.


А выход какой-нибудь есть?
Вам нужен предпоследний закрытый Вашей совой ордер? если да, то просто добавьте в Ваш код счетчик - i++; Находите 1 ордер i=1, находите 2 - i=2 и если (i=2) break;
Если нужны все значения - то массив Profit[ i] = OrderProfit()+...; i++;
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Прошу помочь с функцией открытия ордеров:

Спойлер


//+------------------------------------------------------------------+
//| Открытие ордера |
//+------------------------------------------------------------------+
// Учтены проверки:
// 1. Связь с сервером и в случае отсутствия сканирует серверы и
// реконнектится RetryAttempts раз.
// 2. Торговый поток. Если он занят, ждет и пробует снова RetryAttempts раз.
// 3. Разрешенность торговли. Если запрещено, ждет и пробует снова
// RetryAttempts раз.
// 4. Остановку работы пользователем.
// 5. Правильность задания цены активации отложек. Если не правильно задана цена, открываем по рынку.
// 6. Проверка стопов и тейков на стоплевел и корректировка по его размеру.
// 7. Обработка ошибок. Те, что возможно исправить, пробуем исправить.
// 8. Если цена отложки слишком близко к рынку, открываемся по рынку.
// 9. Если цена для рыночного ордера ушла от цены нашего открытия на MaxOpenOrdDev пунктов и выше, выходим.
// Исправить:
// 1. Добавить ецн режим. Проставлять стопы с тейками после открытия.
// 2. if (error==0)
// {
// EAComment(" Ордер успешно открыт.");
// if(!OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) EAComment(" Ошибка доступа к ордеру!!");
// OrderPrint();
// return(ticket);
// }
// Вроде как может не работать, может не найти сразу новый ордер по тикету???? Нужна задержка????

int SendOrder(string symbol, int cmd, double lot, double price, double stoploss, double takeprofit)
{
int cnt=0, error=GetLastError(), ticket=-1;
bool exit_loop=false, limit_to_market=false;

EAComment(" Попытка открыть "+OrderTypeToString(cmd)+" лотом "+DoubleToString(lot,LotDigits)+" по цене "+DoubleToString(price,PriceDigits)+
" sl:"+DoubleToString(stoploss,PriceDigits)+" tp:"+DoubleToString(takeprofit,PriceDigits));

// Основные проверки на состояние, если пройдены, продолжим.
if(ConditionCheck() {
EAComment(" Не смогли открыть ордер!");
return(-1);
}
// Теперь нормализуем все переданные функции цены
price=NormalizeDouble(price,PriceDigits);
stoploss=NormalizeDouble(stoploss,PriceDigits);
takeprofit=NormalizeDouble(takeprofit,PriceDigits);
// Проверим стопы и тейки на близость к рынку (на стоплевел)
if(stoploss>0) stoploss=StopLevelCheck(cmd,price,stoploss);
if(takeprofit>0) takeprofit=TakeLevelCheck(cmd,price,takeprofit);
error = 0;
// Цвет значка открытия:
if(cmd==OP_BUY||cmd==OP_BUYLIMIT||cmd==OP_BUYSTOP) arrow_color=Blue;
if(cmd==OP_SELL||cmd==OP_SELLLIMIT||cmd==OP_SELLSTOP) arrow_color=Red;

// Проверка цены открытия для отложек, если все плохо, открываем по рынку.
if(cmd==OP_BUYLIMIT&&Ask {
EAComment(" Неправильная цена для байлимит ордера: Цена установки выше текущей цены!");
cmd=OP_BUY;
price=Ask;
}
if(cmd==OP_SELLLIMIT&&Bid>price)
{
EAComment(" Неправильная цена для селллимит ордера: Цена установки ниже текущей цены!");
cmd=OP_SELL;
price=Bid;
}
if(cmd==OP_BUYSTOP&&Ask>price)
{
EAComment(" Неправильная цена для байстоп ордера: Цена установки ниже текущей цены!");
cmd=OP_BUY;
price=Ask;
}
if(cmd==OP_SELLSTOP&&Bid {
EAComment(" Неправильная цена для селлстоп ордера: Цена установки выше текущей цены!");
cmd=OP_SELL;
price=Bid;
}

// Лимитные и стоповые ордера
if (cmd==OP_BUYSTOP||cmd==OP_SELLSTOP||cmd==OP_BUYLIMIT||cmd==OP_SELLLIMIT)
{
cnt=0;
while (!exit_loop)
{
//Пробуем открыть ордер:
if (IsTradeAllowed())
{
ticket=OrderSend(symbol, cmd, lot, price, slippage, stoploss, takeprofit, ExpertName+
" Magic:"+IntegerToString(magic), magic, 0, arrow_color);
error=GetLastError();
}
else cnt++; // Если не вышло, накручиваем счетчик попыток
//И разбираемся в причине:
switch (error)
{
case 0:
//Если все ок, выходим из цикла
exit_loop = true;
break;
case 4: //Торговый сервер занят.
case 6: //Нет связи с торговым сервером.
case 129: //Неправильная цена Bid или Ask, возможно, ненормализованная цена.
case 132: //Рынок закрыт.
case 137: //Брокер занят.
case 145: //Модификация запрещена, так как ордер слишком близок к рынку.
case 146: //Подсистема торговли занята.
ReConnect(); // Делаем реконнект
cnt++;
break;
case 135: //Цена изменилась.
case 136: //Нет цен.
case 138: //Запрошенная цена устарела, либо перепутаны Bid и Ask.
RefreshRates();
continue;
case 130: //Слишком близкие стопы или неправильно рассчитанные цены
{
// Проверяем на близость цены установки к рынку (стопы и тейки уже проверили)
double ServerMinStop=StopLevel*PricePoint;
if (cmd==OP_BUYSTOP||cmd==OP_BUYLIMIT)
{
if (MathAbs(Ask-price) limit_to_market=true;
}
if (cmd==OP_SELLSTOP||cmd==OP_SELLLIMIT)
{
if (MathAbs(Bid-price) limit_to_market = true;
}
exit_loop = true;
break;
}
default:
exit_loop = true;
break;
}
//Если количество попыток превысило допустимое, выходим
if (cnt>RetryAttempts) exit_loop=true;
// Сообщаем о неудачном открытии ордера
if (exit_loop)
{
if (error!=0) EAComment(" Неисправимая ошибка:" + NoRetryError(error));
if (cnt>RetryAttempts) EAComment(" Количество попыток достигло максимального "+IntegerToString(RetryAttempts));
}
// Если выходить рано
if (!exit_loop)
{
EAComment(" Ошибка при попытке (№ "+IntegerToString(cnt)+" из "+IntegerToString(RetryAttempts)+"): " + RetryError(error));
SleepRandomTime();
RefreshRates();
}
}
// Вышли из цикла. Если нет ошибок, сообщаем об открытии и возвращаем тикет ордера:
if (error==0)
{
EAComment(" Успешно установили отложенный ордер.");
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
{
OrderPrint();
return(ticket);
}
}
// Если была ошибка и ордер не открыли:
if (!limit_to_market)
{
EAComment(" Не смогли установить отложенный ордер после "+IntegerToString(cnt)+" попыток");
EAComment(" Ордер: " + OrderTypeToString(cmd)+" лотом "+DoubleToString(lot,LotDigits)+" по цене "+DoubleToString(price,PriceDigits)+" sl:"+
DoubleToString(stoploss,PriceDigits)+" tp:"+DoubleToString(takeprofit,PriceDigits));
EAComment(" Последняя ошибка: "+IntegerToString(GetLastError()));
return(-1);
}
}
// Если отложка была близко к рынку:
if (limit_to_market)
{
EAComment(" Открываем отложенный ордер по рынку, так как цена слишком близко.");
if (cmd==OP_BUYSTOP||cmd==OP_BUYLIMIT)
{
cmd=OP_BUY;
price=Ask;
}
else if (cmd==OP_SELLSTOP||cmd == OP_SELLLIMIT)
{
cmd=OP_SELL;
price=Bid;
}
}

// Открытие по рынку
error=GetLastError();
error=0;
ticket=-1;

if (cmd==OP_BUY||cmd==OP_SELL)
{
cnt=0;
while (!exit_loop)
{
if (IsTradeAllowed())
{
// Если цена ушла от цены открытия на MaxOpenOrdDev пунктов и выше, выходим.
RefreshRates();
if(cmd==OP_BUY)
{
if(MathAbs(price-Ask)>MaxOpenOrdDev*PricePoint)
{
return(-1);
EAComment(" Не смогли открыть ордер, цена ушла слишком далеко!");
}
else price=Ask;
}
if(cmd==OP_SELL)
{
if(MathAbs(price-Bid)>MaxOpenOrdDev*PricePoint)
{
return(-1);
EAComment(" Не смогли открыть ордер, цена ушла слишком далеко!");
}
else price=Bid;
}
// пробуем открыть ордер
ticket=OrderSend(symbol, cmd, lot, price, slippage, stoploss, takeprofit, ExpertName+" Magic:"+IntegerToString(magic), magic, 0, arrow_color);
error=GetLastError();
}
// Если не вышло, крутим счетчик попыток
else cnt++;
// И разбираемся в причине
switch (error)
{
case 0:
exit_loop = true;
break;
case 4: //Торговый сервер занят.
case 6: //Нет связи с торговым сервером.
case 129: //Неправильная цена Bid или Ask, возможно, ненормализованная цена.
case 132: //Рынок закрыт.
case 137: //Брокер занят.
case 145: //Модификация запрещена, так как ордер слишком близок к рынку.
case 146: //Подсистема торговли занята.
ReConnect(); // Делаем реконнект
cnt++;
break;
case 135: //Цена изменилась.
case 136: //Нет цен.
case 138: //Запрошенная цена устарела, либо перепутаны Bid и Ask.
RefreshRates();
continue;
default:
exit_loop = true;
break;
}
if (cnt>RetryAttempts) exit_loop=true;
if (!exit_loop)
{
EAComment(" Ошибка при попытке (№ "+IntegerToString(cnt)+" из "+IntegerToString(RetryAttempts)+"): " + RetryError(error));
SleepRandomTime();
RefreshRates();
}
if (exit_loop)
{
if (error!=0) EAComment(" Неисправимая ошибка:" + NoRetryError(error));
if (cnt>RetryAttempts) EAComment(" Количество попыток достигло максимального "+IntegerToString(RetryAttempts));
}
}
if (error==0)
{
EAComment(" Ордер успешно открыт.");
if(!OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) EAComment(" Ошибка доступа к ордеру!!");
OrderPrint();
return(ticket);
}
else
{
EAComment(" Не смогли открыть ордер после "+IntegerToString(cnt)+" попыток");
EAComment(" Ордер: " + OrderTypeToString(cmd)+" лотом "+DoubleToString(lot,LotDigits)+" по цене "+DoubleToString(price,PriceDigits)+
" sl:"+DoubleToString(stoploss,PriceDigits)+" tp:"+DoubleToString(takeprofit,PriceDigits));
EAComment(" Последняя ошибка: "+IntegerToString(GetLastError()));
return(-1);
}
}
return(0);
}



Вроде как может не работать, может не найти сразу новый ордер по тикету???? Нужна задержка????И нужна ли вообще такая проверка или если уж ордерсенд вернул тикет, значит ордер абсолютно точно открыт???
Спойлер


if (error==0)
{
EAComment(" Ордер успешно открыт.");
if(!OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) EAComment(" Ошибка доступа к ордеру!!");
OrderPrint();
return(ticket);
}



Подскажите, чего еще не хватает? Может совет какой?
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Silentspec Стремишься к совершенству? :d Поддерживаю.
имхо: если есть тикет, то значит ордер попал и зарегистрирован в базе брокера и по идее в ответе сервера вместе с номером тикета приходит и вся остальная инфа об ордере, т.е. МТ уже всё должен знать...
Поэтому считаю эту проверку лишней.
Проблема, которую встречал (торгуя вручную) после посыла запроса проходит несколько секунд в течение которых нет никакой реакции - ни реджекта, занятости или ещё чего. Как сова отрабатывает эту задержку не знаю... ошибки нет и тикета нет... - по идее должна ждать ответа от ОрдерСенд по-любому.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

0ll, понял, спасибо!
Ну да, пытаюсь максимально улучшить используемую библиотеку по мере сил и возможностей...
Так на глаз, может чего не хватает? :)

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Так на глаз, может чего не хватает? :)

Хватает, даже лишнее есть!
Я бы не реконнектился (особенно при "рынок закрыт" по выходным). МТ чётко отслеживает и сам реконнектится (следил за этим). Ставить Слип - не желательно - терминал повиснет, а если на нём ещё совы стоят? Выход только ставить таймер и по событию возвращаться в модуль открытия. (имхо)
Ещё по другому можно скомпоновать код - более универсально, вынести обработчик ошибок и т.д.
Ещё можно проверять последнее время сервера (если больше минуты - выход из цикла, кстати не знаешь: рефреш (при занятости брокера) вешает сову ?)
Может оформить это всё в класс... 8->
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Спасибо за советы, буду дорабатывать.
Нет, вроде как рефреш просто вернет в этом случае false и все.

Мой реконнект:

Спойлер



#define WM_COMMAND 0x0111

#import "user32.dll"
int GetAncestor (int hWnd, int gaFlags);
int PostMessageA (int hWnd, int Msg, int wParam, string lParam);
#import

//+------------------------------------------------------------------+
//| Сканирование серверов и реконнект при обрыве связи |
//+------------------------------------------------------------------+
// Функция выполняет сканирование серверов брокера и реконнект в
// случае обрыва связи
void ReConnect()
{
// Получаем Handle терминала
int MetaTrader = GetAncestor (WindowHandle (Symbol(), Period()), 2);
// Команда пересканировать все сервера
if (MetaTrader != 0)
{
PostMessageA (MetaTrader, WM_COMMAND, 37400, NULL);
}
return;
}



Мой слип:
Спойлер


//+------------------------------------------------------------------+
//| Sleep |
//+------------------------------------------------------------------+
void SleepRandomTime()
{
if (IsTesting()||IsOptimization()) return;

double tenths = MathCeil(SleepTime / 0.1);
if (tenths
double maxtenths = MathRound(SleepMaximum/0.1);
double p = 1.0 - 1.0/tenths;

Sleep(1000);
for(int i=0; i if (MathRand() > p*32768) break;
Sleep(1000);
}
}

Изменено пользователем Silentspec
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Прошу помощи в реализации советника для работы с отложенными ордерами. Необходимо, чтобы советник выставлял сетку отложенных ордеров в определенное время с заданным шагом и лотом, по истечении времени закрывал открытые позиции и удалял не сработавшие ордера. Пробовал слепить из нескольких советников запутался вконец...Заранее спасибо

777.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

За реконнект спасибо. Мне пока не нужно, но код интересен.
А Слип он и в африке... Как писали метаквоты в МТ один поток на все совы, т.е. совы, установленные на один счёт, отрабатывают свой код в порядке очереди - соответственно Слип одной совы вешает всех. Поэтому стараюсь делать через таймер, но это сильно усложняет код, т.к. таймер может быть вызван из открытия, модификации или закрытия ордера - вот и мечтаю собраться с духом и сделать класс - вызвал и забыл...

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Набросал рефреш с проверкой на получилось/не получилось обновить:)

Спойлер


//+------------------------------------------------------------------+
//| Рефреш |
//+------------------------------------------------------------------+

bool Refresh()
{
bool exit_loop=false;
int cnt=0;
while (!exit_loop)
{
if(RefreshRates()) return(true); // Если получилось
if(!RefreshRates()) // Если не получилось
{
EAComment(" Не удалось обновить цены (с "+IntegerToString(cnt)+" попыток из "+IntegerToString(RetryAttempts)+")");
cnt++; // Плюсуем счетчик
SleepRandomTime(); // Подождем
}
if (cnt>RetryAttempts)
{
EAComment(" Не удалось обновить цены!");
exit_loop=true; // Если попыток много, выходим
}
}
return(false);
}



теперь if(!Refresh()) ReConnect();
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Silentspec иногда поражаюсь твоей работоспособности... прям как молодой... :d
Но с рефрешем имхо - зря...
Поясню моё имхо: в МТ идут котиры и МТ запоминает котиры и время по всем инструментам в своём потоке. В это время в другом потоке выполняются совы и индюки. Если у совы тяжёлая аналитика, то котир может устареть и рефреш тупо спрашивает МТ: "нет-ли посвежее", в ответ МТ отдаёт то, что есть(а может и ничего не делает - если устареть не успела).., на брокера доп.запрос НЕ отправляется!(имхо)
Читаем справку: "Возвращает true, если данные обновлены, иначе false", т.е. false - значит, что данные ещё свежие! Ну и нахрен тогда это всё? сова будет в цикле ждать следующего тика по этому инструменту, а другие совы в терминале - курить..., а потом очередь дойдёт до след. совы с таким-же кодом и всё заново! Этак и терминал повесится.

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Всем привет.
Спасибо за видеоуроки, познавательно.
Прошу помочь в следующем, необходимо чтобы происходит Тралл всех открытых сделок. Имеется следующий код:
void Trall ()
{
for (int i = 0; i {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if (Bid-OrderOpenPrice()> TrailingStop*Point)
{
if (OrderStopLoss() {
SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);
if (OrderStopLoss()!=SL)
if (OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0))
{
Print("Модифицирован");
}
else Print ("нет");
}
}
}
if (OrderType()== OP_SELL)
{
if (OrderOpenPrice()-Ask>= TrendStep*Point)
{
if (OrderStopLoss() >Ask+(TrailingStop+TrailingStep)*Point)
{
SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
if (OrderStopLoss()!=SL)
if (OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0))
{
Print("Модифицирован");
}
else Print ("нет");
}
}
}
}
}
}
}
при запуске на тестере не происходит трейлинг. Подскажите в чем проблема?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


при запуске на тестере не происходит трейлинг. Подскажите в чем проблема?

А что в журнале пишет?
кроме этого, ничего не заметил:
if (OrderOpenPrice()-Ask>= TrendStep*Point)
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Здравствуйте.
Помогите пожалуйста. Прошу не смейтесь только)). Я вообще в mql не понимаю. Скажите что надо дописать или написать, чтобы горизонтальные линии индикатора не шли бесконечно вправо, т.е. нужно заменить луч, на линию до текущего бара. Индикатор приложил чтоб понятно было о чем речь, но хотелось бы научиться!
Заранее благодарен.

FiboPiv_v2.3_indikatorforeks.ru.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

В индюке использованы горизонтальные линии и нужно поменять время окончания линии (выделено):
ObjectCreate(name, OBJ_HLINE, 0, Time[0], lvl,Time[0],lvl);
пробуйте так:
ObjectCreate(name, OBJ_TREND, 0, Time[0], lvl,Time[9],lvl);

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Спасибо за отклик, но не помогло((
Зеленым выделил, то что хотелось бы иметь. (там пример с индикатором другим)
Нужно чтобы линия шла до отступа, не дальше.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Спасибо большое)) а я писал ray_right=false))) Спасибо еще раз, научили!!!)) теперь исправлю ObjectCreate(name, OBJ_TREND, 0, Time[0], lvl,Time[9],lvl); поставлю больше свечей и вообще огонь))

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

привет, друзья, подскажите.. как проверить такое условие..

если значение переменной на баре 1 принадлежит диапазону [1..6] (1 и 6 включены в диапазон), а ее значение на баре 2 было меньше 0, тогда условие верно

ну и для отрицательного диапазона

если значение переменной на баре 1 принадлежит диапазону [-1..-6] (-1 и -6 включены в диапазон), а ее значение на баре 2 было больше 0, тогда условие верно

Сама переменная - это сложная функция, результаты расчетов которой записываются в массив double

подскажите код?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Yura Vakulenko
- Назовём Вашу переменную Val1 - на 1 баре и Val2 на 2-м
- Сначала надо сохранить пред. значение в Val2 = Val1
- Вы рассчитали значение на 1 баре и записали в переменную Val1 = f()
- проверка: if (Val1 >= 1 && Val1 Реально в чате не удобно подобные вещи обсуждать...

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Yura Vakulenko
- Назовём Вашу переменную Val1 - на 1 баре и Val2 на 2-м
- Сначала надо сохранить пред. значение в Val2 = Val1
- Вы рассчитали значение на 1 баре и записали в переменную Val1 = f()
- проверка: if (Val1 >= 1 && Val1 Реально в чате не удобно подобные вещи обсуждать...



Ок, спасибо.. сейчас буду программировать. Отпишусь о результатах.. Ну это мне нужно для проверок значений индикатора ССI.. буду химичить..
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано



при запуске на тестере не происходит трейлинг. Подскажите в чем проблема?

А что в журнале пишет?
кроме этого, ничего не заметил:
if (OrderOpenPrice()-Ask>= TrendStep*Point)


ну да, косяк
в журнале не отображается ничего, кроме открытия последнего ордера.
Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...