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

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


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

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

Помогите написать сигнал с двух индикаторов,FORCE и CCi,как это сделать через цикл?или как то по другому?
Условие,если FORCE находится внутри канала ( Force > -FORCE_level && Force if(CCiпосле и больше 55 баров так же смотрим на CCi
if(CCI > CCI_level)return(OP_SELL);

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

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

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

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

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

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

Перейти

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

Перейти

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

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

Через цикл или просто на каждом баре отслеживаете вход/выход индюка из канала и сохраняете время события.

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

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


Через цикл или просто на каждом баре отслеживаете вход/выход индюка из канала и сохраняете время события.


А как ч через цикл?как именно? Если можно на примере,спасибо
Ссылка на сообщение
Поделиться на другие сайты

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



Через цикл или просто на каждом баре отслеживаете вход/выход индюка из канала и сохраняете время события.

А как ч через цикл?как именно? Если можно на примере,спасибо
Примерно так:
int i;
double Force;
for (i = 1; i {
Force = iForce(NULL,0,iPeriod,MODE_SMA,PRICE_CLOSE, i);
if (Force FORCE_level) break;
}
if (i >= BarCnt) //Условие выполнено - проверяем ССИ и вход
{

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

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



Здравстуйте! От ошибки "OrderSend error 130" все равно не получается избавится! Появляется при долгосрочном тестировании иногда, ордера отложенные, стоп-лос и тейк профит навны 0. Кто знает от чего это может быть????

После вызова ОрдерСэнд проверяете магик если


При проверке магика ни чего не происходит. Наверно, вы имели ввиду проверить тикет ордера, а не магик: если тикет
1) 2015.07.06 15:07:56.576 2015.05.06 05:55 Tester: order #3, buy 0.02 EURUSD is opened at 1.12061
2) 2015.07.06 15:07:56.576 2015.05.06 05:55 EURUSD,M15: OrderSend error 130
3) 2015.07.06 15:07:56.576 2015.05.06 05:55 EURUSD,M15: OOP: 1.11761 max_gr_1: 1.12061 Lot: 0.01 Type: 1.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Sany2912, да Вы выложите целиком посмотреть что там на ваяли, а то предлагаете угадать картину целиком по кусочку пазла :-?.
Ссылка на сообщение
Поделиться на другие сайты

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

Не могу понять из-за чего так происходит???

Чего-ж тут непонятного? Всё просто:
Бай открылся и в тут-же попытка открыть рыночный Селл (Type: 1) , а т.к. цена ордера не соответствует текущей цене - выдаёт ошибку. Ищите почему у Вас открывается рыночный Селл.
Ссылка на сообщение
Поделиться на другие сайты

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


Не могу понять из-за чего так происходит???

Чего-ж тут непонятного? Всё просто:
Бай открылся и в тут-же попытка открыть рыночный Селл (Type: 1) , а т.к. цена ордера не соответствует текущей цене - выдаёт ошибку. Ищите почему у Вас открывается рыночный Селл.


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

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



Не могу понять из-за чего так происходит???

Чего-ж тут непонятного? Всё просто:
Бай открылся и в тут-же попытка открыть рыночный Селл (Type: 1) , а т.к. цена ордера не соответствует текущей цене - выдаёт ошибку. Ищите почему у Вас открывается рыночный Селл.
Нет, не рыночный, а выставляется отложенный селл-стоп, по другому уровню и с ним проблем нет! Проблема иногда появляется, когда срабатывает бай-стоп и открывается ордер бай...
Я ничего не знаю про Селл-Стоп, я вижу в журнале "Type: 1" - это обычный Селл или Вы что-то другое в журнал выводите?
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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




Через цикл или просто на каждом баре отслеживаете вход/выход индюка из канала и сохраняете время события.

А как ч через цикл?как именно? Если можно на примере,спасибо
Примерно так:
int i;
double Force;
for (i = 1; i {
Force = iForce(NULL,0,iPeriod,MODE_SMA,PRICE_CLOSE, i);
if (Force FORCE_level) break;
}
if (i >= BarCnt) //Условие выполнено - проверяем ССИ и вход
{

}

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

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

Oll не получается у меня получить прибыльность 5 , 3.7 максимально , а мартин чистый ставить не хочу, кое что переделал и просадка уже больше 30 % пошла. Как вынести флаги на true или folse не разбирусь? В коде как написать.

SNAG-15070719060100.png

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

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

Как вынести флаги на true или folse не разбирусь? В коде как написать.

Что значит "вынести"? Флаг это булева переменная:
bool flag;
flag = true; - может это?
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


Как вынести флаги на true или folse не разбирусь? В коде как написать.

Что значит "вынести"? Флаг это булева переменная:
bool flag;
flag = true; - может это?


Все мучею запрет на работу советника в разные стороны бай и сел , хочу в настройки вынести true . Не получается сделать запрет в коде , не пойму куда вставить и как правильно записать.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Все мучею запрет на работу советника в разные стороны бай и сел , хочу в настройки вынести true . Не получается сделать запрет в коде , не пойму куда вставить и как правильно записать.

Так-бы сразу и написал:
enum DIRenum { Авто=-1, Бай=0, Селл=1 }; // это сверху во внешних параметрах
input DIRenum Направление_входа = Авто;

if (Направление_входа == Авто) // здесь определяешь направление, если режим - авто
{

}
else // здесь просто входишь по заданному в Направление_входа направлению
{

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

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

Добрый день, коллеги трейдеры.
Имеется проблема в работе скрипта. Скрипт простейший - открывает ордер. Проблема в том, что никак не дается рассчет стоп-лосса и тейк профита. Задаю эти параметры в команде - вылетает ошибка, хотя они вроде бы корректные. Пробую задать фиксированные - то же ошибка. В общем, непонятно.
Вот код:
void OnStart()
{
string Symb=Symbol();
string type="OP_SELL";
double lot1=0.01;
int start_sl=20;
int start_tp=20;
double SL;
double TP;
SL=Bid+(start_sl*Point);
TP=Bid-(start_tp*Point);
int ticket1=OrderSend(Symb, type, lot1, Ask, 2, SL, TP);
if (ticket1{
Alert("Ошибка открытия ордера №1: ",GetLastError()," Тип:",type, " Цена:",Ask," SL:",SL," TP:",TP);
}
}

Прошу коллективный разум помочь, в чем ошибка?
Спасибо всем за внимание!

Добавил:
терминал билд 840
проверил торговый приказ, в частности содержимое переменных SL и TP - корректен он, а ошибка вываливается.
Если задаю 0,0 - SL и TP все работает.

Например, был такой вывод:
Ошибка открытия ордера №1: 130 Тип:OP_SELL Цена:1.1014 SL:1.1032 TP:1.0992 - но ведь данные корректны?

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

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

То, что на поверхности:
вместо string type="OP_SELL"; пиши int type=OP_SELL; //(я удивлен, что с другим типом работает)

и попробуй задавать СЛ и ТП после открытия ордера:
if (ticket1{
Alert("Ошибка открытия ордера №1: ",GetLastError()," Тип:",type, " Цена:",Ask," SL:",SL," TP:",TP);
}
else
{
OrderModify(...)
}

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

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

Спасибо за идею - попробую модифицировать ордер после открытия, но есть опасения: а если не получится модифицировать - ордер останется висеть без стопа?

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

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


Спасибо за идею - попробую модифицировать ордер после открытия, но есть опасения: а если не получится модифицировать - ордер останется висеть без стопа?

Проверяй результат Модифи и зацикливай - как вариант...
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Решил проблему!!!
Истина, как оказалось, была где-то рядом...

Проблема была в строке string type="OP_SELL"; это значение не принималось.
Ордер-то открывался BUY, соответственно и стопы с профитами были некорректны.

Переменная, передаваемая в ordersend должна быть числовая, а не текстовая - отсюда все проблемы.
Виновата моя невнимательность. Прошу у всех прощения за беспокойство и огромное спасибо всем за помощь!


Добавлено: 08-07-2015 08:35:59

0ll - Вы мне очень помогли, спасибо!!! =d>
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
VSATester, спасибо принято говорить "с занесением в личное дело" - для этого 2 кнопки в каждом посте.
Это раз.

А второе - а где код работающего скрипта для форумчан?
Неработающий код выложили - а работающий скрипт нет.
Помощь на форуме получил - делись с форумом исправленным рабочим скриптом.
Ссылка на сообщение
Поделиться на другие сайты

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

Работающий код.

void OnStart()
{
string Symb=Symbol();

double lot1=0.01;
int start_sl=20;
int start_tp=20;

int type=1; // SELL

double SL=Bid+(start_sl*Point);
double TP=Bid-(start_tp*Point);

int ticket1=OrderSend(Symb, type, lot1, Bid, 2, SL, TP);
if (ticket1 {
Alert("Ошибка открытия ордера №1: ",GetLastError(), " Цена:",Ask," SL:",SL," TP:",TP);
}
}

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
VSATester, а обрезать ТП/СЛ до значности счета не хотите?
Насколько помню, это тоже одна из причин отказа в выставлении ордера.

Что касается выставления ТП/СЛ в момент открытия рыночного ордера, то на ECN счетах это же вроде недопустимо: там ордер сначала открывается с нулевыми ТП/СЛ - а потом модифицируется .

И, наконец, как насчет бай ордеров, мэджика и коммента?

Какой-то странный у вас "работающий" скрипт пока - слегка, местами работающий... :)
Ссылка на сообщение
Поделиться на другие сайты

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

Если вот так стоп лос записать будет учитываться комиссия ? SL = NormalizeDouble ( Ask + (OrderCommission() + OrderSwap() + TrailingStop) * Point,Digits);

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

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

Если вот так стоп лос записать будет учитываться комиссия ? SL = NormalizeDouble ( Ask + (OrderCommission() + OrderSwap() + TrailingStop) * Point,Digits);

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

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

Условия стали выполнятся когда сделал так
i = 0;
double force = iForce(NULL,0, FORCE_period, FORCE_method, FORCE_applied_price, 1);
if(force > -FORCE_level && force {
for(i=1; i {
RefreshRates();
double FORCE = iForce(NULL,0, FORCE_period, FORCE_method, FORCE_applied_price, i);
if(FORCE > -FORCE_level && FORCE if(FORCE >= FORCE_level)break;
if(FORCE }
}
double CCI = iCCI(NULL, 0, CCI_period, CCI_price, 1);
double CCI2 = iCCI(NULL, 0, CCI_period, CCI_price, 2);
if(i>=Bars_2)
{
if(CCI2 -CCI_level)return(OP_BUYLIMIT);
if(CCI2 > CCI_level && CCI }

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

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

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

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

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

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

Войти

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

Войти

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


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

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