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

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


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

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

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

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

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

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

Перейти

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

Перейти

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

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

Подскажите почему не хочет пичатать строку в терминале , вроде нет ошибок.
/| Expert tick function функции выполняющиеся на каждом тике ДЗ 1 |
//+------------------------------------------------------------------+
int Start ()
{
int x; // обьявляем переменную х так как тип int она имеет целочисленное значение
bool bl; // bool имеет всего 2 значения true = правда false = лож
string ctr = " урок 1"; // string позволяет написать некую информацию строкой

x = 2;


if(x == 0)bl = true;
else bl = false;

if(bl == true)ctr = ctr + " TradeLikeAPro forever...";
else ctr = ctr + " Insta must die!";

Print (ctr);
Comment(ctr);
Alert(ctr);

return(0);
}
//+-----------------------------------------------------

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Dron15 не "пичатает" потому, что тиков нет - выходной сегодня. Перенеси код в OnInit и смотри...
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

вот пользуюсь такой стандартной логикой для вычисления лота через процент от риска

все хорошо работает скажем на AUDUSD, с $770 = 0.6 lot , или EURJPG

но для GBPUSD выдает ошибку "Not Enough Money"

есть идеи почему?


extern double Depo = 0;
extern double RiskPercent = 80;
extern double Lots = 0;
extern int Magic = 113355;
extern int Slippage = 3;
extern double StopLoss = 100;
extern double TakeProfit = 50;

int OnInit()
{
if(Digits==3 || Digits ==5)
{
TakeProfit*=10;
StopLoss*=10;
Slippage *=10;
CandelSize *=10;
}
return(INIT_SUCCEEDED);
}
void OnTick()
{
....
point=MarketInfo(pairs[MaxIndex],MODE_POINT);
dig=MarketInfo(pairs[MaxIndex],MODE_DIGITS);


Lots=GetLots(pair);

//SELL
SL=NormalizeDouble(CurrentPriceAsk+StopLoss*point,dig);
TP=NormalizeDouble(CurrentPriceBid-TakeProfit*point,dig);

OrderSend(pair, OP_SELL, Lots,CurrentPriceBid, Slippage, SL,TP,"Sell",Magic,0,Blue)

//BUY
SL=NormalizeDouble(CurrentPriceBid-StopLoss*point,dig);
TP=NormalizeDouble(CurrentPriceAsk+TakeProfit*point,dig);
OrderSend(pair,OP_BUY, Lots, CurrentPriceAsk,Slippage, SL,TP,"Buy",Magic,0,Green)

}
double GetLots(string pair)
{
double pipValue = MarketInfo(pair,MODE_TICKVALUE);
double lot=0;

if (Depo==0)
Depo=AccountFreeMargin();

lot=NormalizeDouble(Depo*RiskPercent/100.0/StopLoss/pipValue,2);

return lot;
}



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

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

Так на фунтобаксе залог вдвое больше нужен, вот вам на открытие ордера и не хватает денег.
Просто прямо делите текущие курс фунта на курс кенгуру - и видите насколько больше нужен залог.
К коду бота это не имеет никакого отношение.

А просто перевести сообщение "Not Enough Money" никак не судьба?! :)

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

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


Так на фунтобаксе залог вдвое больше нужен, вот вам на открытие ордера и не хватает денег.
Просто прямо делите текущие курс фунта на курс кенгуру - и видите насколько больше нужен залог.
К коду бота это не имеет никакого отношение.

А просто перевести сообщение "Not Enough Money" никак не судьба?! :)



я понимаю что значит эта фраза, вопрос в том почему тот же самый скрипт и логика работает на других парах
да если уменьшить риск все работает

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

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

http://ubr.ua/labor-market/education/kursami-syt-ne-budesh-chto-nujno-znat-prejde-chem-zapisatsia-na-it-kursy-340272

Так, для общего понимания темы программирования...

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

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

Тоже хочу написать универсальный расчет лота в зависимости от SL, но пока застрял с расчетом стоимости 1 пункта..

Подскажите, как рассчитать стоимость 1 пункта не зная объем лота? В тех формулах, которые я нашел берется зависимость от лота.

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

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

Здравствуйте. Подскажите пожалуйста,почему инд. в терминале отображается, а в тестере нет? Пишет: zero divide in 'FOREX INVINCIBLE SIGNAL~.mq4' (290,60) Вроде обычный стрелочник.

FOREX_INVINCIBLE_SIGNAL~.mq4

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
alex198 там деление на 0, поэтому не запускается. Вот пробуй, эту ошибку исправил, но не факт, что она последняя...

FOREX_INVINCIBLE_SIGNAL-.mq4

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
HighInv размер лота, это не то, что Вы думаете, это размер стандартного лота брокера = 100000 ед.валюты счёта (у норм. брокеров)
MarketInfo(NULL, MODE_LOTSIZE) - Это размер лота для Вашего счёта
MarketInfo(NULL, MODE_TICKVALUE) - это то, что Вам нужно
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


HighInv размер лота, это не то, что Вы думаете, это размер стандартного лота брокера = 100000 ед.валюты счёта (у норм. брокеров)
MarketInfo(NULL, MODE_LOTSIZE) - Это размер лота для Вашего счёта
MarketInfo(NULL, MODE_TICKVALUE) - это то, что Вам нужно


Да, пока еще не разобрался, много чепухи в голове...

MODE_TICKVALUE - это стоимость 1 пункта в валюте депозита, т.е. заниматься дополнительным переводом, скажем для GPBCAD не нужно?
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте!
Друзья, кто знает способы, как можно написать код так, чтоб при убыточном закрытии ордера (любого направления) следующий открывался с увеличенным лотом?

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

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


Здравствуйте!
Друзья, кто знает способы, как можно написать код так, чтоб при убыточном закрытии ордера (любого направления) следующий открывался с увеличенным лотом?


Для этого нужно по истории перебрать ордера и найти последний затем вернуть его профит и если профит меньше нуля то вернуть лот

//+------------------------------------------------------------------+

datetime time=0; double profit=0,lots=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
if(OrderSymbol()==_Symbol)
if(OrderMagicNumber()==MagicNumber || MagicNumber==-1)
if(OrderCloseTime()>time) // находим последний в истории ордер
{
time=OrderCloseTime(); // запомним время
profit=OrderProfit(); // запомним профит
his_lt=OrderLots(); // запомним лот
}

if(profit lots=his_lt*2; // Увеличим в два раза

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

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



Здравствуйте!
Друзья, кто знает способы, как можно написать код так, чтоб при убыточном закрытии ордера (любого направления) следующий открывался с увеличенным лотом?


Для этого нужно по истории перебрать ордера и найти последний затем вернуть его профит и если профит меньше нуля то вернуть лот

//+------------------------------------------------------------------+

datetime time=0; double profit=0,lots=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
if(OrderSymbol()==_Symbol)
if(OrderMagicNumber()==MagicNumber || MagicNumber==-1)
if(OrderCloseTime()>time) // находим последний в истории ордер
{
time=OrderCloseTime(); // запомним время
profit=OrderProfit(); // запомним профит
his_lt=OrderLots(); // запомним лот
}

if(profit lots=his_lt*2; // Увеличим на два

//+------------------------------------------------------------------+


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

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


alex198 там деление на 0, поэтому не запускается. Вот пробуй, эту ошибку исправил, но не факт, что она последняя...



Спасибо большое. Но всё равно не работает. Т.е. на график ставишь-стрелки на прошедших свечах появляются, а на новых нет.

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

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


alex198 там деление на 0, поэтому не запускается. Вот пробуй, эту ошибку исправил, но не факт, что она последняя...

Спасибо большое. Но всё равно не работает. Т.е. на график ставишь-стрелки на прошедших свечах появляются, а на новых нет.
Такой индюк - криво написан. >:d
Ссылка на сообщение
Поделиться на другие сайты

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

Делаю д.з. к 6-му уроку.
Открыл в ручную две позиции:
1. eurusd -> buy
2. audjpy -> sell

Запускаю скрипт, чтобы открыть отложенные ордера. По Евро ничего не срабатывает. По Ауди/ейна открывается стоп, но по цене открытой позиции.

В журнале пусто. Пытался найти ошибку через Print(), но почему-то упорно Print тоже не работает!?

Подскажите, где ошибка?

Защитные_отложенные_ордера.mq4

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

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


Делаю д.з. к 6-му уроку.
Открыл в ручную две позиции:
1. eurusd -> buy
2. audjpy -> sell

Запускаю скрипт, чтобы открыть отложенные ордера. По Евро ничего не срабатывает. По Ауди/ейна открывается стоп, но по цене открытой позиции.

В журнале пусто. Пытался найти ошибку через Print(), но почему-то упорно Print тоже не работает!?

Подскажите, где ошибка?


Там Валом ошибок
//+------------------------------------------------------------------+
//| Защитные отложенные ордера.mq4 |
//| Copyright 2015, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property script_show_inputs
extern int pointForOrder = 500;
extern int Slippage = 5;

extern string Symbol_A="EURUSD";
extern string Symbol_B="AUDJPY";
extern double volume=0.01;
double open,pfo,price=0;
int digits,point;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int b_a=0,s_a=0,b_b=0,s_b=0;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS))
{
if(OrderSymbol()==Symbol_A)
{
if(OrderType()==OP_BUYSTOP) b_a++;
if(OrderType()==OP_SELLLIMIT) s_a++;
}
if(OrderSymbol()==Symbol_B)
{
if(OrderType()==OP_BUYSTOP) b_b++;
if(OrderType()==OP_SELLLIMIT) s_b++;
}
}

double point_a=MarketInfo(Symbol_A,MODE_POINT);
int digits_a=(int)MarketInfo(Symbol_A,MODE_DIGITS);

double point_b=MarketInfo(Symbol_B,MODE_POINT);
int digits_b=(int)MarketInfo(Symbol_B,MODE_DIGITS);

if(b_a==0)
{
pfo=NormalizeDouble(pointForOrder*point_a,digits_a);
price=NormalizeDouble(MarketInfo(Symbol_A,MODE_ASK),digits_a);
open=NormalizeDouble(price+pfo,digits_a);
Comment(price," ",pfo);
if(OrderSend(Symbol_A,OP_BUYSTOP,volume,open,Slippage,0,0)>=0)
Print("Успешно по символу ",Symbol_A);
else
Print("Ошибка по символу ",Symbol_A," ",GetLastError());
}

if(s_a==0)
{
pfo=NormalizeDouble(pointForOrder*point_a,digits_a);
price=NormalizeDouble(MarketInfo(Symbol_A,MODE_BID),digits_a);
open=NormalizeDouble(price+pfo,digits_a);
if(OrderSend(Symbol_A,OP_SELLLIMIT,volume,open,Slippage,0,0)>=0)
Print("Успешно по символу ",Symbol_A);
else
Print("Ошибка по символу ",Symbol_A," ",GetLastError());
}
}
//+------------------------------------------------------------------+
Ссылка на сообщение
Поделиться на другие сайты

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


Там Валом ошибок



Спасибо за отклик.
Исправил несколько ошибок: Нормализовал pfo, поставил условие на OrderSend.
Начал думать, как сделать условие на проверку уже установленных отложенных ордеров, т.к. у вас в коде строго прописаны только 2 пары.
Но сначала решил проверить код, т.к. повторно выставлять отложенные ордера не стал бы.
Ничего не изменилось. Опять на Евро ничего не происходит, а Ауди/йена выставляется по цене открытия уже установленного ордера.
В Журнале снова никаких следов Print'а.

Запустил ваш код.
Почему цена отсчитывается от Ask и Bid? Нам же нужно считать от цены открытия ордера?
Зачем открывать два отложенных противоположно направленных ордера?
Сработало только на Евро. В Журнале тоже никаких следов Print'a.

Защитные_отложенные_ордера.mq4

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

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



Там Валом ошибок



Спасибо за отклик.
Исправил несколько ошибок: Нормализовал pfo, поставил условие на OrderSend.
Начал думать, как сделать условие на проверку уже установленных отложенных ордеров, т.к. у вас в коде строго прописаны только 2 пары.
Но сначала решил проверить код, т.к. повторно выставлять отложенные ордера не стал бы.
Ничего не изменилось. Опять на Евро ничего не происходит, а Ауди/йена выставляется по цене открытия уже установленного ордера.
В Журнале снова никаких следов Print'а.

Запустил ваш код.
Почему цена отсчитывается от Ask и Bid? Нам же нужно считать от цены открытия ордера?
Зачем открывать два отложенных противоположно направленных ордера?
Сработало только на Евро. В Журнале тоже никаких следов Print'a.

Ну вы же объяснили чего хотите так ведь ? Если объяснили то пожалуйста покажите то что Вы хотите получить в итоге...
Ссылка на сообщение
Поделиться на другие сайты

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



Ну вы же объяснили чего хотите так ведь ? Если объяснили то пожалуйста покажите то что Вы хотите получить в итоге...


Не совсем понимаю, как можно показать то, что не получается :)

Как я понял из задания:
Открыты ордера без стопов и тейк-профитов. Скрипт позволяет открыть защитные отложенные ордера (Sell-limit/buy-Stop) на любых парах, где уже открыты ордера без стопов.

Без задания, для себя: Выводить те или иные сообщения в журнал (например, выставлен защитные ордер или произошла ошибка). До этого урока, когда писал советников, в этом не возникало сложности. А вот для скрипта почему-то не получается записывать в журнал :(
Ссылка на сообщение
Поделиться на другие сайты

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




Ну вы же объяснили чего хотите так ведь ? Если объяснили то пожалуйста покажите то что Вы хотите получить в итоге...


Не совсем понимаю, как можно показать то, что не получается :)

Как я понял из задания:
Открыты ордера без стопов и тейк-профитов. Скрипт позволяет открыть защитные отложенные ордера (Sell-limit/buy-Stop) на любых парах, где уже открыты ордера без стопов.

Без задания, для себя: Выводить те или иные сообщения в журнал (например, выставлен защитные ордер или произошла ошибка). До этого урока, когда писал советников, в этом не возникало сложности. А вот для скрипта почему-то не получается записывать в журнал :(

А как же вы селлимитами собираетесь защититься ?
ТЗ какое ?

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

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



А как же вы селлимитами собираетесь защититься ?
ТЗ какое ?

ну есть на франке бай и что мы ему лепить то будем бай стоп ? селл стоп? Бай лимит что ?



Точно!!! Спасибо! Нам на бае Селл-стоп нужен. А у меня Селл-лимит.
Осталось два вопроса:
1. Отложенный ордер открывается на уровне открытия существующего ордера, а нужно чтобы к нему что-то добавлялось/отнималось (в моем коде это pointForOrder).
2. Почему не срабатывает Print?

Защитные_отложенные_ордера.mq4

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

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

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

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

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

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

Войти

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

Войти

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


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

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