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

От xbms, 13 апреля, 2013 в Уголок Программиста

#4876

Сергей ,будьте добры провести урок по написанию советника ( индикатора) "Экономический календарь " , я знаю готовые эксперты есть , но хочется самому писать такие штуки , которые строят календари и т.п. сайт желательно использовать investig.com или в связке несколько сайтов и кто первый обновит данные , те данные советник и покажет - главное скорость в получении информации . Чтобы в терминале были все нужные графы :

Календарь.png

Изменено 2 ноября, 2017 пользователем 4er58

#4877

Возник вопрос касаемо библиотек, мне надо, чтобы функции библиотеки использовали внешние (редактируемые перед запуском) переменные, в интернете видел, что достаточно в самой библиотеке продублировать необходимые extern/input переменные, но тогда во время работы программы они не подменяются переменными из основной программы, править каждую функцию как-то не очень хочется передавая кучу лишних параметров, особенно ели extern подразумевает под собой изменения в ходе выполнения.

#4878
SVS696 может не понял вопрос...
У меня во внешней библиотеке функции ММ и относящиеся к ним input переменные. библиотека подключается к сове - происходит тупо копирование кода библиотеки в то место совы, где была объявлена библиотека. Т.е. input переменные из библиотеки Вы можете увидеть среди переменных совы, если туда вставите вызов типа: #include <_mm.mqh>
Кстати в сове переменные из библиотеки доступны как свои.
#4879


SVS696 может не понял вопрос...
У меня во внешней библиотеке функции ММ и относящиеся к ним input переменные. библиотека подключается к сове - происходит тупо копирование кода библиотеки в то место совы, где была объявлена библиотека. Т.е. input переменные из библиотеки Вы можете увидеть среди переменных совы, если туда вставите вызов типа: #include <_mm.mqh>
Кстати в сове переменные из библиотеки доступны как свои.


mqh же только заголовочный файл? Не, я знаю, что можно тупо туда код запихнуть, но это не совсем то.

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

Добавлено: 07-11-2017 17:27:32

если попытаться внешние переменные вставить внутри
#import "lib.ex4"
СЮДА Т.Е. вставить
#import

, то импорт рассыпается и компилятор ругается, что нет закрытия #import

Изменено 7 ноября, 2017 пользователем SVS696

#4880

Значит не правильно понял...
1. Вы хотите создать общие переменные для библиотеки и совы?
2. Вы хотите непременно подключать компилированную библиотеку, а не компилированную не хотите?
Если сейчас правильно понял, то не знаю чем помочь.
Если это Ваша библиотека, то подключите её не компилированную и радуйтесь общим глобальным переменным - вообще не вижу препятствий.

#4881

Ребят открыл счет в альпари , и в терминале , при сделках стали выводиться комментарии типо таких 1[0] . Советники ни какие не висят , а счет стал комментироваться , что за ерунда , не отслеживает ли или не копирует ли сделки брокер ? хрень какая то ...

комменты.png

#4882

Здравствуйте! Подскажите что не правильно в этом блоке (он проводит только один цикл )

int GetProfitLoss()// Количество последних убыточных ордеров
{
int Loss = 0;
int N=30;
datetime lastCloseTime = 0;
int cnt = OrdersHistoryTotal();
for(int i = cnt-N; i {
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && lastCloseTime {
lastCloseTime = OrderCloseTime();
}
if (OrderProfit()
if(OrderProfit()>0) break;

}

return(Loss);
}

#4883


Подскажите что не правильно в этом блоке (он проводит только один цикл )


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

int GetProfitLoss()// Количество последних убыточных ордеров
{
int Loss = 0;
int N=30;
int cnt = OrdersHistoryTotal();
for(int i = cnt-N; i {
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderProfit() }
return(Loss);
}
#4884

1. Да я считаю ордера на всех парах и магиках.

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

Изменено 11 ноября, 2017 пользователем alex202

#4885

Так начните цикл с конца - с последнего закрытого, тогда Вы правильно написали условие if(OrderProfit()>0) break;
т.е.:
int cnt = OrdersHistoryTotal();
for ( int i = cnt-1; i >= 0; i-- )

Изменено 11 ноября, 2017 пользователем 0ll

#4886

Сделал, только снова что то не так :-s

int GetProfitLoss()// Убыток по закрытым ордерам (количество последних убыточных ордеров)
{
int Loss = 0;
int cnt = OrdersHistoryTotal();
for( int i = cnt-1; i {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId)
{
if (OrderProfit()
if(OrderProfit()>0) break;
}
}
}
return(Loss);
}

#4887

Вы писали, что считаете ордера на всех парах и магиках, а зачем тогда проверка?
Это условие напишите так: if ( OrderProfit() В остальном замечаний нет - будет работать.

Изменено 11 ноября, 2017 пользователем 0ll

#4888

Всё спасибо большое. В общем как то так, пришлось условие немного подкорректировать ( i >= 0, а не i
int GetProfitLoss()// Убыток по закрытым ордерам (количество последних убыточных ордеров)
{
int Loss = 0;
int cnt = OrdersHistoryTotal();
for( int i = cnt-1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId)
{
if (OrderProfit() }
}
}
return(Loss);
}

#4889

Здравствуйте трейдеры! Помогите решить проблему с автоматизацией стратегии. Суть заключается в том, что бы входить в сделку лишь на первой свече пользовательского индикатора "Xo" (Скрин прилагаю).
В данном советнике отображена функция входя в сделку на зеленых свечах и на продажу при красных (постоянное открытие). Однако мне нужно что бы вход был лишь по первой свече данного индикатора. Как обыграть эту задачу, просто ума не приложу ~x( ~x( ~x( Буду рад любой помощи. Заранее Спасибо.

Xo.mq45 скач.
Советник.mq45 скач.
Безымянный.png

#4890

Как обыграть эту задачу, просто ума не приложу

У индикатора 2 буфера - зелёный и красный. Условие на покупку:
if ( red_buf[2] == 0 && green_buf[1] >=1 ) open_buy(); // переменные и функции вымышленные (на всякий)
[2] - номер бара на котором брать значение индюка.
#4891

Извините, но я не совсем понял... После взятия значений индикатора, я пишу условие на наличие баров одного из цветов и присваиваю им массив (т.е. номер бара)... Это так должно выглядеть? (если да, то по какой причине возникает ошибка array required?)

//+------------------------------------------------------------------+
green_buf = iCustom (NULL,0,"Xo", KirPER , 0, 0);
red_buf = iCustom (NULL,0,"Xo", KirPER , 1, 0);
//+------------------------------------------------------------------+ Сделка на продажу
if (red_buf[1] >= 1 && green_buf[2] == 0 )
{
if (CountSell() == 0 && DoTrades == TRUE) //+ Проверка наличия ордеров в рынке
{
if (OrderSend (Symbol(), OP_SELL, Lots, Bid, Slippage, sl_s, tp_s, comment, Magic, 0, clrRed) {
Print ("Ошибка открытия ордер на продажу");
}
}
}
//+------------------------------------------------------------------+ Сделка на покупку
if (red_buf[2] == 0 && green_buf[1] >=1)
{
if (CountBuy ()==0 && DoTrades == TRUE) //+ Проверка наличия ордеров в рынке
{
if (OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, sl_b, tp_b, comment, Magic, 0, clrBlue) {
Print ("Ошибка открытия ордер на покупку");
}
}
}
//+------------------------------------------------------------------+

#4892
Александр_F всё немного сложнее. iCustom возвращает значение индикатора на запрашиваемом баре, нам нужно знать 4 значения: зелёный на 1 и 2 баре и красный на 1 и 2 баре. Как их получить, есть несколько способов, самый доступный для понимания, но затратный с точки зрения ресурсов компа:
red_buf1 = iCustom (NULL,0,"Xo", KirPER , 1, 1);
red_buf2 = iCustom (NULL,0,"Xo", KirPER , 1, 2);
green_buf1 = iCustom (NULL,0,"Xo", KirPER , 0, 1);
green_buf2 = iCustom (NULL,0,"Xo", KirPER , 0, 2);
и далее без массивов - if (red_buf1 >= 1 && green_buf2 == 0 )
я не советую использовать значение индюка на 0 баре, ибо там может быть хаос.
если индюк перерисовывает, то входы, в итоге, будут не соответствовать картинке.
#4893

0ll, Спасибо за ваш ответ. Однако данная функция не решила проблему. Сделки стали открываться на третьей свече сигналов индикатора и в дальнейшем советник продолжает серию открытия ордеров (Скрин прилагаю)

//+------------------------------------------------------------------+
red_buf1 = iCustom (NULL,0,"Xo", KirPER , 1, 1);
red_buf2 = iCustom (NULL,0,"Xo", KirPER , 1, 2);
green_buf1 = iCustom (NULL,0,"Xo", KirPER , 0, 1);
green_buf2 = iCustom (NULL,0,"Xo", KirPER , 0, 2);
//+------------------------------------------------------------------+ Сделка на продажу
if (red_buf1 {
if (CountSell() == 0 && DoTrades == TRUE)
{
if (OrderSend (Symbol(), OP_SELL, Lots, Bid, Slippage, sl_s, tp_s, comment, Magic, 0, clrRed) {
Print ("Ошибка открытия ордер на продажу");
}
}
}
//+------------------------------------------------------------------+ Сделка на покупку
if (red_buf2 == 0 && green_buf1 >= 1)
{
if (CountBuy ()==0 && DoTrades == TRUE)
{
if (OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, sl_b, tp_b, comment, Magic, 0, clrBlue) {
Print ("Ошибка открытия ордер на покупку");
}
}
}
//+------------------------------------------------------------------+

Безымянный.png

Изменено 12 ноября, 2017 пользователем Александр_F

#4894

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

#4895

Да, вы правы, индюк действительно перерисовывает. Однако, все равно не понятно почему советник продолжает открывать ордера в одном из направлений. Суть вопроса именно в препятствии дальнейшему открытию сделок.

#4896

red_buf1

#4897

Не знаю поможет ли точно:

можно попробовать на каждом баре писать значения индюка в bool
shift_red_1 =
shift_red_2 =
shift_green_1 =
shuft_green_2 =
if(shift_red_1==true&&shift_red_2==true){...}

#4898

0ll, Не помогло, да и тенденция открытия сделок существует как на Buy так и на Sell.

#4899
Александр_F трудно стаказать что-то, надо изучать код. По своему опыту скажу, индюки показывающие направление торговли сами по себе бесполезны, их потолок - фильтрация сделок по другим сигналам. имхо.
#4900

0ll, так то да, пользы в них очень мало. Но если их использовать в торговле бинарными опционами, где прибыль зависит от положения цены выше или ниже точки открытия. Такие советники могут быть очень полезны. Скажем в рамках 2-3 баров. П.э. я просто хотел поэкспериментировать с данными индикаторами. А уже потом перевести данный код в торговлю на БО (там всего горстка отличий)

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

Перейти к списку тем
Форум · 2.0.20260627.0025