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

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


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

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




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

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



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

extern int pointForOrder = 500;
extern int Slippage = 5;

double open,pfo,volume;
int digits;
double point; // тип дабл
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
double op=0,lt=0; string sy=NULL;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
op=OrderOpenPrice();
lt=OrderLots();
sy=OrderSymbol();
point=MarketInfo(sy,MODE_POINT);
digits=(int)MarketInfo(sy,MODE_DIGITS);

if(OrderType()==OP_BUY)
{
//if(digits == 3 || digits == 5) это дикий бред
//{
// pfo *= 10;
// Slippage *= 10;
//}

open=NormalizeDouble(op -pointForOrder*point,digits);
if(OrderSend(sy,OP_SELLSTOP,lt,open,Slippage,0,0)>=0)
Print("Успешно по символу ",sy);
else
Print("Ошибка по символу ",sy," ",GetLastError()," ",open);
}

if(OrderType()==OP_SELL)
{
open=NormalizeDouble(op+pointForOrder*point,digits);
if(OrderSend(sy,OP_BUYSTOP,lt,open,Slippage,0,0)>=0)
Print("Успешно по символу ",sy);
else
Print("Ошибка по символу ",sy," ",GetLastError()," ",open);
}
}
else return;
}
//+------------------------------------------------------------------+
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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



У меня работает.



Блин, ошибка оказалась именно в типе Point!!! Я думал, что размер пункта в целый числах!

Почему ты считаешь проверку Digits бредом? У меня на Демо 4 знака, на Реале 5 знаков. Допустим pointForOrder = 500. Если покупаю на демо по цене 1,0900, то отложка выставляется на 1,0400.
Если покупаю на реале, то здесь уже вменяемая отложка 1,0850.

Также не разобрался, почему Print не работает. Запустил твой код, во вложении скрин (к названию добавил "1", чтобы не конфликтовал с моим файлом)

Print.jpg

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

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




У меня работает.



Блин, ошибка оказалась именно в типе Point!!! Я думал, что размер пункта в целый числах!

Почему ты считаешь проверку Digits бредом? У меня на Демо 4 знака, на Реале 5 знаков. Допустим pointForOrder = 500. Если покупаю на демо по цене 1,0900, то отложка выставляется на 1,0400.
Если покупаю на реале, то здесь уже вменяемая отложка 1,0850.

Также не разобрался, почему Print не работает. Запустил твой код, во вложении скрин (к названию добавил "1", чтобы не конфликтовал с моим файлом)

возможно не в тот журнал смотришь.
Второе проверка на дигитс не нужна, и не нужно писать тот бред который я назвал бредом.
при установке скрипта выведи так что бы открывались настройки, и в зависимости от типа счета 4 или 5 знаков ставь значения 50 или 500 ... И не привыкай писать такой код, этот фрагмент использовался в 2006-2008 годах когда 5 значные брокеры только стали появляться и что бы не было путаницы писали этот фрагмент, сейчас каждый трейдер знает свой тип счета. Дадите свой код поюзать другу и друг сразу получит минуса ...
Если собираетесь писать коды то учитесь правильному...
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

{
ticket = (OrderSend(Symbol(),OP_BUY , Lots,NormalizeDouble(Ask,Digits),Slippage,0,0,NULL,Magic,0,Red)==-1); //
Print("Ошибка ",GetLastError()," открытия ордера ");
if(ticket > 0)

{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits );
OrderModify(ticket,OrderOpenPrice(),0,TP,0,Red);
}

подскажите почему может ордер OrderModify возмущаться прямой ошибки нет а посылает предупреждение?

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

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


{
ticket = (OrderSend(Symbol(),OP_BUY , Lots,NormalizeDouble(Ask,Digits),Slippage,0,0,NULL,Magic,0,Red)==-1); //
Print("Ошибка ",GetLastError()," открытия ордера ");
if(ticket > 0)

{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits );
OrderModify(ticket,OrderOpenPrice(),0,TP,0,Red);
}

подскажите почему может ордер OrderModify возмущаться прямой ошибки нет а посылает предупреждение?


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

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



{
ticket = (OrderSend(Symbol(),OP_BUY , Lots,NormalizeDouble(Ask,Digits),Slippage,0,0,NULL,Magic,0,Red)==-1); //
Print("Ошибка ",GetLastError()," открытия ордера ");
if(ticket > 0)

{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits );
OrderModify(ticket,OrderOpenPrice(),0,TP,0,Red);
}

подскажите почему может ордер OrderModify возмущаться прямой ошибки нет а посылает предупреждение?


Вы не проверяете результат работы OrderModify


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

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




{
ticket = (OrderSend(Symbol(),OP_BUY , Lots,NormalizeDouble(Ask,Digits),Slippage,0,0,NULL,Magic,0,Red)==-1); //
Print("Ошибка ",GetLastError()," открытия ордера ");
if(ticket > 0)

{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits );
OrderModify(ticket,OrderOpenPrice(),0,TP,0,Red);
}

подскажите почему может ордер OrderModify возмущаться прямой ошибки нет а посылает предупреждение?


Вы не проверяете результат работы OrderModify


Если возможно покажите как правильно .

if( OrderModify(ticket,OrderOpenPrice(),0,TP,0,Red)==false)
Print("OrderModify Error ", GetLastError());
else
Print("OrderModify Ok ");
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Помогите исправить ошибки , сам не справляюсь и покажите что не так чтоб мог проанализировать.

Новый_текстовый_документ.txt

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

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


Помогите исправить ошибки , сам не справляюсь и покажите что не так чтоб мог проанализировать.


Поправил ошибки, логических ошибок не искал...

isprav.mq4

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

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

// int order_type= FindLastOrderType(); 1 ошибка
else 2 ошибка
Comment(" ордеров открыто "+(string)count); 3 ошибка

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

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

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


// int order_type= FindLastOrderType(); 1 ошибка
else 2 ошибка
Comment(" ордеров открыто "+(string)count); 3 ошибка

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


потому что полно логических ошибок вот немного поправил

isprav.mq4

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

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



// int order_type= FindLastOrderType(); 1 ошибка
else 2 ошибка
Comment(" ордеров открыто "+(string)count); 3 ошибка

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


потому что полно логических ошибок вот немного поправил


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

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




// int order_type= FindLastOrderType(); 1 ошибка
else 2 ошибка
Comment(" ордеров открыто "+(string)count); 3 ошибка

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


потому что полно логических ошибок вот немного поправил


спасибо буду разбираться у вас немного все по другому в функциях.

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

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

Eсли есть у кого пример трелинг стопа выложите файлик , не как не разберусь в логике , и среднюю цену сетки ордеров чтоб найти нужно OrderOpenTime * OrderLots/Count ?

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

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

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

Условие: если предыдущий бар меньше 100 пунктов, то ...

Пишу так (для бычьей свечи): if ((Close[1]-Open[1])*Point
Ошибку компилятор не выдает, но при работе советник не учитывает размер свечи (есть и другие условия для входа, размер свечи - один из них)! Как буд-то этого условия и нет вовсе! Что не правильно?

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
nct21 надо: if ((Close[1]-Open[1]) / Point
Dron15 примеры трейлинга лучше поискать самому в кодабазе. у меня, конечно есть, но они уже очень не простые...
А вычислять среднюю цену сетки лучше с учётом лотности, т.е. точку безубытка:
сначала в цикле перебора ордеров сетки суммируем лотности ордеров и суммируем произведение лота на цену открытия.
затем, по завершению цикла, делим сумму(лот*цена) / сумму(лот)
...{
aSumLot += OrderLots();
aSumPrcLot += OrderOpenPrice() * OrderLots();
... }
prc_bu = NormalizeDouble(aSumPrcLot / aSumLot,_Digits);
Ссылка на сообщение
Поделиться на другие сайты

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

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

модифи_ордерс.txt

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Dron15 я посмотрел - там тихий ужас. x_x
По-моему Вы вообще не представляете что пишите. Без обид.
Что это:
OSL = NormalizeDouble(OrderStopLoss(),Digits)&& OrderType()== otype;
SL = OSL;
- не разгадал... тем более потом вычисляете SL, но не используете...

OrderModify - там цена конкретного, модифицируемого ордера, а не БУ!
По сути получается, что БУ вычислили, а что делать с ним не знаете?
Порядок такой:
- для трала есть 3 значения - дистанция для старта(tral_Start), дистанция СЛ(tral_Stop) и шаг изменения СЛ(tral_Step)
1. вычислили БУ
2. если от цены до БУ более чем tral_Start - включаем трал (больше ни для чего ЬУ не используется)
3. если от цены до СЛ более чем tral_Stop + tral_Step - модифицируем ордера
4. вычисляем СЛ = цена +- tral_Stop (это у Вас правильно)
5. собственно цикл модификации
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Dron15 не стесняйся пиши. Вам нужно в разных функциях это делать.
1. при удачном открытии ордера вычисляем БУ (в отдельной функции или вместе с ф-цией контроля количества ордеров)
2. в ф-ции Старт контролируем момент для запуска трала (дистанцию от цены до БУ и СЛ)
3. если контроль сработал вычисляем новое значение СЛ
4. запускаем ф-цию модификации и передаём туда тип ордеров и новый СЛ.
Ссылка на сообщение
Поделиться на другие сайты

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

Всем привет!
Вопрос следующего характера. Как установить индикатор HMA Color на часовой график, но при этом данные чтобы брались с 4-х часового графика?

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

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

Как установить индикатор HMA Color на часовой график, но при этом данные чтобы брались с 4-х часового графика?

Не знаю на чём индюк построен, но если на МА, то надо просто в 4 раза период увеличить и всё.
Ссылка на сообщение
Поделиться на другие сайты

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

Привет все! Прошу подсказать новичку.
По учебному курсу мучаю трейлинг-стопы. Отладку не получается использовать. Пытаюсь через Print вывести время, в котором произошел вход в процедуру трейлинга. Тестирую на одном дне. В журнал сообщений почти всегда выходит время после 23:00. Изредка часть тиков показывает 18:00, а остальную после 23:00. Что я делаю не так?
как мне вывести время, чтобы понять на каком участке дня мой трейлинг-стоп не срабатывает?

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

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

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

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

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

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

Войти

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

Войти

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


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

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