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

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

#3176


haiduc сове и индюку цвет линий до лампочки - главное номер буфера и значение в нём. Там, где Вы нашли решение, на след. странице есть моя сова для проверки стрелочных индюков, она подойдёт для проверки любых 2-х цветных индюков - надо только условия входа/выхода изменить.


понял, благодарю! надо просто проверить if (priceliniaGREEN != EMPTY_VALUE && CountBuy() ==0 && Ask вроде работает. а с примера выше, который я нашел, так другие номера буферов открывают ордера по стрелке. как хорошо, когда мучаешься, но понимаешь суть процесса!
#3177
Цитата


Найк у Вас сова работает по закрытию бара ибо Вы используете индюк на 1-баре, но каждый тик его проверяете. примените в самом начале след код и сова станет быстрее работать:

static datetime new_Bar = 0;
if (new_Bar == Time[0]) return; //Если бар не закрыт - выход
new_Bar = Time[0];



Спасибо. Эта штука, хотя я ее и переделал помогла мне разобраться в касяках кода.

Так смешно.
В одном индюке стояло условие, перебирать до 1>=0 вместо i>=0.
И он перебирал. А в другом другой косяк был.

Так что все дело в опечатках в коде оказалось.
#3178

Просьба помочь нубу в mql. Почему-то мои совы даже такого вида

//+------------------------------------------------------------------+
//| Drifter 1.00.mq4 |
//| Copyright 2016, SVS |
//| /profile/77648-SVS696 |
//+-----------------------------------------------------------------+
#property copyright "Copyright 2016, SVS"
#property link "/profile/77648-SVS696"
#property version "1.00"
#property strict
#property show_inputs
//--- input parameters
input bool FixedLot=false;
input bool DinamicSpread=false;
input float Lot=1.00;
input float Percentage=2.0;
input float Follow=0.5;
input int StopZerro=100;
input int FollowStop=170;
input int Distance=200;
input int MiddleSpread=20;

//+------------------------------------------------------------------+
//| Expert program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---

}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+


не открывают менюшку параметров, да и вообще не пашут. Хотя если копирую полностью чей-то пример, то все нормально.

Как скрипт все нормально работает.
#3179


Просьба помочь нубу в mql. Почему-то мои совы даже такого вида

Спойлер

//+------------------------------------------------------------------+
//| Drifter 1.00.mq4 |
//| Copyright 2016, SVS |
//| /profile/77648-SVS696 |
//+-----------------------------------------------------------------+
#property copyright "Copyright 2016, SVS"
#property link "/profile/77648-SVS696"
#property version "1.00"
#property strict
#property show_inputs
//--- input parameters
input bool FixedLot=false;
input bool DinamicSpread=false;
input float Lot=1.00;
input float Percentage=2.0;
input float Follow=0.5;
input int StopZerro=100;
input int FollowStop=170;
input int Distance=200;
input int MiddleSpread=20;

//+------------------------------------------------------------------+
//| Expert program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---

}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+


не открывают менюшку параметров, да и вообще не пашут. Хотя если копирую полностью чей-то пример, то все нормально.

Как скрипт все нормально работает.


Удали строку: #property show_inputs
#3180


Удали строку: #property show_inputs


Если бы все так было просто... Вообщем я уже проверял и проверил ещё раз. Не работает, даже если убрать все #property.

Изменено 20 февраля, 2016 пользователем SVS696

#3181
SVS696, выстави в настройках разрешение торговать совам(в настройках терминала сервис-настройки-советники), если и при этом у тебя не будут показываться инпуты, и елис ты этот код действительно запускаешь из папки скриптов - то выход один - сноси на хрен терминал и ставь его с нуля, так как код у тебя абсолютно верно написан, все работает(я про инпуты), я проверил.

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


SVS696, и елис ты этот код действительно запускаешь из папки скриптов

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



1) Если я компилю в скрипт и кидаю в скрипты, то все нормально, а вот при компиляции совы (естественно потом кидаю в советники) уже окошко начинает отрисовываться и сразу пропадает. В другом терминале аналогично. Компилирую именно сову, код с нуля даже писал.

2)Про double спасибо

Изменено 20 февраля, 2016 пользователем SVS696

#3183



1) Если я компилю в скрипт и кидаю в скрипты, то все нормально, а вот при компиляции совы (естественно потом кидаю в советники) ужи окошко начинает отрисовываться и сразу пропадает.



тебе уже выше правильно написали. в сове не нужен show_inputs. это скриптовый параметр как и show_indicator_inputs(ну или как его там, точно не помню лексикон) - индикаторный.
тебе в любом случае в логах пишется ошибка при таких подходах что ты используешь скриптовые вещи в сове и наоборот. выводится критическая ошибка типа "this is not script" или наподобие.
#3184




1) Если я компилю в скрипт и кидаю в скрипты, то все нормально, а вот при компиляции совы (естественно потом кидаю в советники) ужи окошко начинает отрисовываться и сразу пропадает.



тебе уже выше правильно написали. в сове не нужен show_inputs. это скриптовый параметр как и show_indicator_inputs(ну или как его там, точно не помню лексикон) - индикаторный.
тебе в любом случае в логах пишется ошибка при таких подходах что ты используешь скриптовые вещи в сове и наоборот. выводится критическая ошибка типа "this is not script" или наподобие.

Косяк тут какой-то

//+------------------------------------------------------------------+
//| Expert program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---

}
//+------------------------------------------------------------------+


Тогда где описывать основное тело советника?
#3185


Тогда где описывать основное тело советника?


OnStart используется только в скриптах и индикаторах(про последние - не точно).

в сова основное тело - это либо стандартно void OnTick() либо если ты хард-тру мультивалютник то void OnTimer()(его еще надо правильно объявлять в ините).
смотря как ты реализовываешь логику.

вобще, я на твоем месте создал бы стандартный код сова через помощника метаэдитора и сам бы увидел все необходимые блоки, которые создаются автоматически.
#3186

подтверждаю:
1. если МТ видит в коде #property show_inputs, то считает это скриптом без вариантов
2. OnStart() - это стартовая функция скрипта
3. OnCalculate() - индикатора
4. OnTick() - для эксперта. Эксперт без этой функции не запустится (если только через таймер)

Запустите этот код как эксперта (сейчас рынок закрыт - алерта не будет - тика нет, но параметры увидите):

input double ddd = 10;
void OnTick() { Alert("Hello World! ddd =",ddd); }

#3187

ups, уже ответили...

#3188

Короче я изучал старый mql4 надо учить mql5) который работает и в новых терминалах.

#3189

Программисты, подскажите! название функции, переменной которой является название индикатора, который отобразится на графике инструмента, к которому прикрепить собственно написанный советник?

Изменено 20 февраля, 2016 пользователем serpent989

#3190

В продолжение темы вопросы от ламера ...=)Мне нужна помощь в функции подсчета ордеров. Считать ордера по позициям я научился благодаря урокам. Теперь мне нужно посчитать конкретные ордера на покупку и конкретные ордера на продажу, как быть? Выручайте!!! =)

#3191


В продолжение темы вопросы от ламера ...=)Мне нужна помощь в функции подсчета ордеров. Считать ордера по позициям я научился благодаря урокам. Теперь мне нужно посчитать конкретные ордера на покупку и конкретные ордера на продажу, как быть? Выручайте!!! =)



параметры ордеров погулить не судьба,не? OrderType(), например.
#3192

Я не совсем ясно выразился. OrderType() это все понятно. Есть 2 ордера на покупку, с разной ценой открытия и разными тейками и стопами, как мне каждый из них отдельно посчитать?

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

#3193

Универсальная функция подсчета ордеров в рынке любого типа (тип передается в функцию) спасет вас, и станет основой любого будущего советника. Почти любой эксперт должен всегда знать есть ли в рынке "его" ордера и в каком количестве.

#3194


Программисты, подскажите! название функции, переменной которой является название индикатора, который отобразится на графике инструмента, к которому прикрепить собственно написанный советник?


Ну вообщем, чтоб ещё понятнее было, то нужна функция обратная этой -
bool ChartIndicatorDelete(
long chart_id, // идентификатор графика
int sub_window, // номер подокна
const string indicator_shortname // короткое имя индикатора
);
Что-то мне подсказывает, что такой функции нет в MQL4...
#3195


Универсальная функция подсчета ордеров в рынке любого типа (тип передается в функцию) спасет вас, и станет основой любого будущего советника. Почти любой эксперт должен всегда знать есть ли в рынке "его" ордера и в каком количестве.


если вы говорите о такой:

int BuyCount()

{
int count = 0;

for (int buy = OrdersTotal()-1; buy>=0; buy--)
{
if(OrderSelect(buy,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic &&
(OrderType() == OP_BUY ))
count++;
}
}
return(count);
}


То она не подойдет
#3196
serpent989, попробуй два цикла. один вложен в другой. главный перебирает окна открытых графиков, а второй перебирает подокна выбранного графика. и почитай про вот эту функцию

https://docs.mql4.com/ru/chart_operations/windowfind

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

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

Изменено 21 февраля, 2016 пользователем dermitay

#3197

Да не надо мне функцию на селл))). Вопрос по другому задам. При появлении сигнала на покупку открывается один ордер на покупку и один на продажу. При появлении сигнала на продажу открывается один ордер на продажу и один на покупку, как это описать в коде? А вообще хотел сказать спасибо, что возитесь с такими как я. Респект вам всем парни

#3198
Гриб я тоже не понял, но попробую - может Вам при открытии 2-ой пары ордеров проверять BuyCount()
serpent989 поддерживаю dermitay - смотри в сторону шаблонов.
#3199
Гриб, я имел ввиду универсальную функцию, подобную этой:

int CountTrades(int otype) //Считаем количество открытых ордеров нужного типа  
{
int Count = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderType() == otype && OrderMagicNumber() == Magic)
Count ++;
}
}
return (Count);
}


А далее ты уже используешь ее в логике открытия как нужно. Например в твоем случае (если я правильно понял):

if (CountTrades(OP_BUY) == 0 && CountTrades(OP_SELL) == 0) //нету наших ордеров в рынке
{
if (Сигнал покупки)
{
Открываем покупки
Открываем продажи
}
else if (Сигнал продажи)
{
Открываем продажи
Открываем покупки
}
}


Дальше включай логику сам
#3200


Гриб, я имел ввиду универсальную функцию, подобную этой:

int CountTrades(int otype) //Считаем количество открытых ордеров нужного типа  
{
int Count = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderType() == otype && OrderMagicNumber() == Magic)
Count ++;
}
}
return (Count);
}


А далее ты уже используешь ее в логике открытия как нужно. Например в твоем случае (если я правильно понял):

if (CountTrades(OP_BUY) == 0 && CountTrades(OP_SELL) == 0) //нету наших ордеров в рынке
{
if (Сигнал покупки)
{
Открываем покупки
Открываем продажи
}
else if (Сигнал продажи)
{
Открываем продажи
Открываем покупки
}
}


Дальше включай логику сам

Мне кажется стоит все собрать за один проход по всем ордерам чем за 2.

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

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