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

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


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

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

Вопрос к программистам. Есть переменная которая имеет значение, но когда терминал перезагружается , то значение теряется. Возможно ли запоминать это значение, после перезагрузки мт4.

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

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

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

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

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

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

Перейти

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

Перейти

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

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

Привет, может у кого есть или кто нибудь может помочь мне написать функцию которая :

Например,если стоит BuyStop,цена до него доходит и он преврашается в маркет ордер, то автоматически отлаживается противоположный SellStop
ордер в другом направлении на определенном расстоянии,потом если цена доходить до етого SellStop ордера ,также снова открывается противоположный ордер,и цикл повторяется.
Спасибо.

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

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


Вопрос к программистам. Есть переменная которая имеет значение, но когда терминал перезагружается , то значение теряется. Возможно ли запоминать это значение, после перезагрузки мт4.


Возможно. Сохранять значения во внешних файлах и при инициализации считывать настройки.
_http://codebase.mql4.com/ru/1025
Ссылка на сообщение
Поделиться на другие сайты

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


Привет, может у кого есть или кто нибудь может помочь мне написать функцию которая :

Например,если стоит BuyStop,цена до него доходит и он преврашается в маркет ордер, то автоматически отлаживается противоположный SellStop
ордер в другом направлении на определенном расстоянии,потом если цена доходить до етого SellStop ордера ,также снова открывается противоположный ордер,и цикл повторяется.
Спасибо.


Советник Чебурашка на форуме Альпари.
Ссылка на сообщение
Поделиться на другие сайты

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

max = 1000;
min = 0;
for (i=min; i {
if(OrderOpenPrice() - i {
low = i; high = i+100*Point;
lengthtolow = OrderOpenPrice() - low;
lengthtohigh = high - OrderOpenPrice();
break;
}
}

как то так.

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

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

Сложновато предложили... Можно сделать без циклов и прочего, кажется вот так должно работать:

extern int Quality=100;- качество настраиваемого уровня
int mod=MathFloor(OrderOpenPrice()/(Quality*Point));
int ToLow=(OrderOpenPrice()-mod*Quality*Point)/Point;
int ToHigh=((mod+1)*Quality*Point-OrderOpenPrice())/Point;


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

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

подскажите пожалуйста, что я делаю не так. уже неделю бьюсь над пробуемой, и не получается :((
нужно, что бы после выполнения функции перевода ордера в безубыток, открылся один отложенный ордер. У меня, почему то, открывается миллион отложенных ордеров

Спойлер


void MovingInWL(string sy="", int op=-1, int mn=-1) {
double po, pp;
int i, k=OrdersTotal();

if (sy=="0") sy=Symbol();
for (i=0; i if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op if (mn po=MarketInfo(OrderSymbol(), MODE_POINT);
if (OrderType()==OP_BUY) {
if (OrderStopLoss()-OrderOpenPrice() pp=MarketInfo(OrderSymbol(), MODE_BID);
if (pp-OrderOpenPrice()>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
double ff= OrderOpenPrice();
ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, ff, Slippage, 0, 0, "", Magic, 0, Red);
}
}
}
if (OrderType()==OP_SELL) {
if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss() pp=MarketInfo(OrderSymbol(), MODE_ASK);
if (OrderOpenPrice()-pp>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
double fd= OrderOpenPrice();
ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, fd, Slippage, 0, 0, "", Magic, 0, Red);
}
}
}
}
}
}
}
}

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

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


подскажите пожалуйста, что я делаю не так. уже неделю бьюсь над пробуемой, и не получается :((
нужно, что бы после выполнения функции перевода ордера в безубыток, открылся один отложенный ордер. У меня, почему то, открывается миллион отложенных ордеров

Спойлер


void MovingInWL(string sy="", int op=-1, int mn=-1) {
double po, pp;
int i, k=OrdersTotal();

if (sy=="0") sy=Symbol();
for (i=0; i if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op if (mn po=MarketInfo(OrderSymbol(), MODE_POINT);
if (OrderType()==OP_BUY) {
if (OrderStopLoss()-OrderOpenPrice() pp=MarketInfo(OrderSymbol(), MODE_BID);
if (pp-OrderOpenPrice()>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
double ff= OrderOpenPrice();
ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, ff, Slippage, 0, 0, "", Magic, 0, Red);
}
}
}
if (OrderType()==OP_SELL) {
if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss() pp=MarketInfo(OrderSymbol(), MODE_ASK);
if (OrderOpenPrice()-pp>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
double fd= OrderOpenPrice();
ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, fd, Slippage, 0, 0, "", Magic, 0, Red);
}
}
}
}
}
}
}
}




так по коду и должно быть: кол-во новых ордеров = кол-ву открытых ордеров (каждый шаг цикла новый ордер).
поставь return(); после строчки ticket = OrderSend... Изменено пользователем shatun
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Ricedeni
Если нужен один, значит нужно так и написать: если ордеров (допустим) BuyStop нет, значит, ставим.
Функции подсчёта ордеров есть в уроках.
И лучше написать: if (OrderModify(.........) - т.е., если ордер модифицирован, значит, ставим отложку.
Ссылка на сообщение
Поделиться на другие сайты

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


Ricedeni
Если нужен один, значит нужно так и написать: если ордеров (допустим) BuyStop нет, значит, ставим.



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

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


Ricedeni
Значит нужно внести нужную цену в переменную и по этой цене, больше не открывать.


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Ricedeni
Функцию нужно писать.
Перебор ордеров.
Если символ, магик, тип (Buystop), цена (OrderOpenPrice()) = нашей переменной...
Да - не ставим ордер, нет - ставим.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


внести цену в переменную я могу, а как потом проверить, что Buystop уже есть по этой цене?



Ну так а видеоуроки зачем писались? Вот например универсальная функция для проверки любых "наших" ордеров в рынке:

int CountTrades(int ordertype)   
{
int Count = 0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == ordertype)
Count ++;
}
}

return (Count);
}


Передаешь в нее нужный тип ордера и проверяешь, вариантов проверок на любой вкус, в твоем случае:

if (CountTrades(BUY_STOP) > 0)
то делаем то-то и то-то


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

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

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

1.png

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

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

Вопрос уважаемым программистам. Как заставить советник торговать на offline М2 графике ренко (график генерируется индикатором RenkoLiveChart v2.1) ?

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

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


кинуть советник на график ренко - как вариант


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

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



кинуть советник на график ренко - как вариант


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

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

RenkoLiveChart_v3.2.mq4

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

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

xbms,Здравствуйте! Подскажите пожалуйста как закрыть большую пачку ордеров?
Набрал вот такой код,но что то он не работает:
void CLOSEORDER(int ord)
{
for (int i=0; i {
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY && ord==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
if (OrderType()==OP_SELL && ord==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,CLR_NONE);
}
}
}
}

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

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


Здравствуйте! Подскажите пожалуйста как закрыть большую пачку ордеров?


//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Закрытие позиций по рыночной цене |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" - любой символ, |
//| NULL - текущий символ) |
//| op - операция (-1 - любая позиция) |
//| mn - MagicNumber (-1 - любой магик) |
//+----------------------------------------------------------------------------+
void ClosePositions(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();

if (sy=="0") sy=Symbol();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn }
}
}
}
}

void ClosePosBySelect() {
bool fc;
color clClose;
double ll, pa, pb, pp;
int err, it;

if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
for (it=1; it if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
if (OrderType()==OP_BUY) {
pp=pb; clClose=clCloseBuy;
} else {
pp=pa; clClose=clCloseSell;
}
ll=OrderLots();
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
if (fc) {
if (UseSound) PlaySound(NameFileSound); break;
} else {
err=GetLastError();
if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
ErrorDescription(err),", try ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber());
Sleep(1000*5);
}
}
} else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}
Ссылка на сообщение
Поделиться на другие сайты

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


xbms,Здравствуйте! Подскажите пожалуйста как закрыть большую пачку ордеров?
Набрал вот такой код,но что то он не работает:
void CLOSEORDER(int ord)
{
for (int i=0; i {
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY && ord==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
if (OrderType()==OP_SELL && ord==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,CLR_NONE);
}
}
}
}



если нужно закрыть все открытые ордера, то тут можно просто поправить так:

void CLOSEORDER()
{
for (int i=0; i {
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
if (OrderType()==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
}
}
}
}


ну и разумеется эту функцию нужно вызвать из нужного места так: CLOSEORDER();
хотя в данном случае её логичней было бы обозвать уже CloseAllopenOrders; :)
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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