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

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

#5551

Здравствуйте всем! Решил скопировать с видеоурока советника с трейлингом, при компиляции выскакивают 3 предупреждения и советник не торгует, все перепроверил, не могу понять что не так. Заниматься начал не давно, помогите подсказкой, за ранее большое спасибо.

Test_Trailing.rar2 скач.

#5552


Здравствуйте всем! Решил скопировать с видеоурока советника с трейлингом, при компиляции выскакивают 3 предупреждения и советник не торгует, все перепроверил, не могу понять что не так. Заниматься начал не давно, помогите подсказкой, за ранее большое спасибо.


Не было открытия, потому что было OnTick.
Ошибки это предупреждения о том, что не объявлена переменная для открытия ордера и модификации. По хорошему ее нужно объявить и если ошибка - выдавать принт, либо дальнейшие действия

Test__Tralling.mq42 скач.

#5553

Уважаемые комрады, а как свое изображение(картинку) создавать на графике, че то потыкал,потыкал, однако не хочет показываться, стесняется наверно)
r)

#5554

Подскажите, как закрыть часть сделки

#5555

подскажите пожалуйста ссылку на работу со стрелочными индикаторами.
интересует как правильно вставлять буфера iCustom в условие. например, известно что всего два буфера, стрелка вырисовываться на первом баре и не перерисовываться. по идее ожидал следующий вид:
if(Open[1] && Price_Down > 0)...

в общем на форуме наверное есть уже разбор это полета.

#5556

а как свое изображение(картинку) создавать на графике

Смотри описание и пример здесь


Подскажите, как закрыть часть сделки

OrderClose и там указываете, кол-во лотов которые надо закрыть, если их меньше чем лотов в ордере, то оставшаяся часть останется в рынке ( при этом тикет ордера изменится )


как правильно вставлять буфера iCustom в условие

примерно так:
double buf1 = iCustom(... );
if ( Close[1] buf1 ) ...

Изменено 6 мая, 2019 пользователем 0ll

#5557

"примерно так:
double buf1 = iCustom(... );
if ( Close[1] buf1 ) ..."



спасибо oll.
но в случае повторной стрелки: сделка закрывается(причем по нулевому бару). открывается новая сделка в противоположном направление и снова через бар(уже по первому) перекрываться в верном направление.

хотелось бы убрать это переоткрытие так,что бы сделка держалась строго до противоположной стрелки.

пробовал твой вариант вариант с стр: /ugolok-programmista/13/obuchenie-yazyku-mql4-pod-metatrader-4/4034/1710.
0ll_e_Check_Indi_1.mq4

и пробовал так: if(Close[1] bufSell && last_type != OP_SELL)
{
last_type = OP_SELL; ...
пока не получилось.

0ll_e_Check_Indi_1.mq40 скач.

Изменено 7 мая, 2019 пользователем Ar4i

#5558

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

Если "правильная" стрелка открывается только на 1-баре, зачем Вы контролируете стрелки на 0-баре? - просто не делайте этого.
#5559

Если "правильная" стрелка открывается только на 1-баре, зачем Вы контролируете стрелки на 0-баре? - просто не делайте этого.



нет. проблема в том. что иногда идет повторная "правильная" стрелка. и так происходит(переоткрытие ?): как на приложенном рисунке.

2.png

Изменено 7 мая, 2019 пользователем Ar4i

#5560

нет. проблема в том. что иногда идет повторная "правильная" стрелка. и так происходит(переоткрытие ?)

Проблема в закрытии - почему закрылась бай сделка и открылась селл? - вот там скорее всего и был "неправильный" сигнал селл. посмотрите это место в визуальном режиме или пишите в лог основания для открытия сделки, чтоб потом почитать последовательность.
#5561

там скорее всего и был "неправильный" сигнал селл


все верно. дело в логике индикатора. "неправильный" сигнал ли? или неотрисовка "правильного"?
#5562

Вы писали:

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

Я так понял, что сигнал на 0-баре неустойчив, но на 1-баре уже не рисует, и вот теперь оказывается Вы сомневаетесь и в 1-баре...
Если индюк может "передумать" и на 1-баре, то нужно торговать на 2, иначе решения нет...
Можно попробовать ставить короткий СЛ с переворотом, но только до закрытия "входного" бара.
#5563

Подскажите, имеется стрелочный индикатор, вот таким образом я обрабатываю сигнал с него

double buyarrow = iCustom(Symbol(), 0, "30_PD_Alert", SignalGap, EnableSoundAlert, EableMailAlert, 1, 1);
double sellarrow = iCustom(Symbol(), 0, "30_PD_Alert", SignalGap, EnableSoundAlert, EableMailAlert, 0, 1);
bool BuySignal=(buyarrow!=EMPTY_VALUE);
bool SellSignal=(sellarrow!=EMPTY_VALUE);
проблема в том, что по окончании следующего бара после стрелки значения BuySignal и SellSignal обнуляются т.к. нет сигнала, а мне необходимо знать какая стрелка была последней, как это сделать?

#5564

мне необходимо знать какая стрелка была последней, как это сделать?

Нужна ещё одна переменная, например:
int LastSig = -1; // -1 - сигнала не было
if ( BuySignal ) { LastSig = OP_BUY; .... } //наверняка у Вас есть этот блок - вставьте туда
if ( SellSignal ) { LastSig = OP_SELL; ... }
#5565


мне необходимо знать какая стрелка была последней, как это сделать?

Нужна ещё одна переменная, например:
int LastSig = -1; // -1 - сигнала не было
if ( BuySignal ) { LastSig = OP_BUY; .... } //наверняка у Вас есть этот блок - вставьте туда
if ( SellSignal ) { LastSig = OP_SELL; ... }


Не совсем понимаю что делать дальше с переменной LastSig
#5566

Не совсем понимаю что делать дальше с переменной LastSig

Вы задали вопрос, я предложил решение, а что делать дальше мне не ведомо... это-ж Ваша стратегия торговли. Можно, например, не входить повторно в Бай, если предыдущий сигнал был Бай.
#5567


Не совсем понимаю что делать дальше с переменной LastSig

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

я просто не понимаю как работает Ваше предложение, если можно разжуйте пожалуйста

Вот кусок кода

Спойлер

if ( isNewBar() )
{
double buyarrow = iCustom(Symbol(), 0, "30_PD_Alert", SignalGap, EnableSoundAlert, EableMailAlert, 1, 1);
double sellarrow = iCustom(Symbol(), 0, "30_PD_Alert", SignalGap, EnableSoundAlert, EableMailAlert, 0, 1);
bool BuySignal=(buyarrow!=EMPTY_VALUE);
bool SellSignal=(sellarrow!=EMPTY_VALUE);




Comment(BuySignal, "\n", buyarrow, "\n", SellSignal, "\n", sellarrow, "\n", Signal);


if (CountSell() == 0)
{

if (SellSignal > 0 && fTimeInZone3s())
{
CloseBuy();


SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
if (ticket >0)
{
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);
}
}
}



логика простая если последняя стрелка sellarrow и время соответствующее, то открываем в sell, если buyarrow то в buy

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

#5568

логика простая если последняя стрелка sellarrow и время соответствующее, то открываем в sell, если buyarrow то в buy

Т.е. получаем новый сигнал, но время не то, сигнал запоминаем, дожидаемся нужного времени и только тогда входим по последнему сигналу?
Вот так можно:

Спойлер


static int LastSig = -1;
if ( isNewBar() )
{
double buyarrow = iCustom(Symbol(), 0, "30_PD_Alert", SignalGap, EnableSoundAlert, EableMailAlert, 1, 1);
double sellarrow = iCustom(Symbol(), 0, "30_PD_Alert", SignalGap, EnableSoundAlert, EableMailAlert, 0, 1);

if (buyarrow!=EMPTY_VALUE) LastSig = OP_BUY;
if (sellarrow!=EMPTY_VALUE) LastSig = OP_SELL;


Comment(BuySignal, "\n", buyarrow, "\n", SellSignal, "\n", sellarrow, "\n", Signal);



if (LastSig == OP_SELL && CountSell() == 0 && fTimeInZone3s() )
{
CloseBuy();

SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
if (ticket >0)
{
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);
}
}

#5569

При тестирований очень медленно все это дело, скажите это зависит от мощности пк или это тестер такой тормознутый? Приходится по тест проводить...
trlolo

#5570
vitek01 понятно, что зависит от мощности/памяти, но большую роль играет качество кода, когда программист понимает, как например организуется цикл в процессоре, как происходит присвоение значения переменной или сравнение двух величин - поневоле начинаешь придумывать наименее затратный алгоритм.
#5571

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

#5572

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

Даже там можно пропускать тики, если дистанция от пред. анализа менее 5 пипс (например).
#5573

Но ведь все равно нужно анализировать... Но за совет- лайк!

#5574


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


В простеньких роботах да. Но если писать нормальную торговую систему, то надо учитывать, что трейдер может переставить отложку, стопы, закрыть/отменить ордер и это может произойти в любой момент. Поэтому я каждый ордер оборачиваю в класс и на каждом тике контролирую его состояние (есть ли он физически и не поменялись ли его параметры). При этом контролируется только ордера с которыми работает советник. Основная ошибка начинающих в работе с ордерами - это тупо каждый раз искать его среди открытых по Magic, OrderSelect достаточно "дорогая" функция, а если ордеров много, а ваш в конце списка, то вот вам и сотня миллисекунд только на поиск.
#5575

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

Вам встречалось частичное закрытие? Сейчас модно закрыть часть ордера, а другая часть может висеть в рынке с другим тикетом, имхо здесь без цикла с OrderSelect не обойтись. Новичков лучше не сбивать - пусть по старинке через цикл ордера контролируют, тем более 90% не слышали о классах вообще ничего.

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

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