Здравствуйте всем! Решил скопировать с видеоурока советника с трейлингом, при компиляции выскакивают 3 предупреждения и советник не торгует, все перепроверил, не могу понять что не так. Заниматься начал не давно, помогите подсказкой, за ранее большое спасибо.
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Здравствуйте всем! Решил скопировать с видеоурока советника с трейлингом, при компиляции выскакивают 3 предупреждения и советник не торгует, все перепроверил, не могу понять что не так. Заниматься начал не давно, помогите подсказкой, за ранее большое спасибо.
Не было открытия, потому что было OnTick.
Ошибки это предупреждения о том, что не объявлена переменная для открытия ордера и модификации. По хорошему ее нужно объявить и если ошибка - выдавать принт, либо дальнейшие действия
Уважаемые комрады, а как свое изображение(картинку) создавать на графике, че то потыкал,потыкал, однако не хочет показываться, стесняется наверно)
r)
Подскажите, как закрыть часть сделки
подскажите пожалуйста ссылку на работу со стрелочными индикаторами.
интересует как правильно вставлять буфера iCustom в условие. например, известно что всего два буфера, стрелка вырисовываться на первом баре и не перерисовываться. по идее ожидал следующий вид:
if(Open[1] && Price_Down > 0)...
в общем на форуме наверное есть уже разбор это полета.
Смотри описание и пример здесьа как свое изображение(картинку) создавать на графике
OrderClose и там указываете, кол-во лотов которые надо закрыть, если их меньше чем лотов в ордере, то оставшаяся часть останется в рынке ( при этом тикет ордера изменится )Подскажите, как закрыть часть сделки
примерно так:как правильно вставлять буфера iCustom в условие
double buf1 = iCustom(... );
if ( Close[1] buf1 ) ...
Изменено 6 мая, 2019 пользователем 0ll
"примерно так:
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; ...
пока не получилось.
Изменено 7 мая, 2019 пользователем Ar4i
Если "правильная" стрелка открывается только на 1-баре, зачем Вы контролируете стрелки на 0-баре? - просто не делайте этого.но в случае повторной стрелки: сделка закрывается(причем по нулевому бару). открывается новая сделка в противоположном направление и снова через бар(уже по первому) перекрываться в верном направление.
Если "правильная" стрелка открывается только на 1-баре, зачем Вы контролируете стрелки на 0-баре? - просто не делайте этого.
нет. проблема в том. что иногда идет повторная "правильная" стрелка. и так происходит(переоткрытие ?): как на приложенном рисунке.
Изменено 7 мая, 2019 пользователем Ar4i
Проблема в закрытии - почему закрылась бай сделка и открылась селл? - вот там скорее всего и был "неправильный" сигнал селл. посмотрите это место в визуальном режиме или пишите в лог основания для открытия сделки, чтоб потом почитать последовательность.нет. проблема в том. что иногда идет повторная "правильная" стрелка. и так происходит(переоткрытие ?)
там скорее всего и был "неправильный" сигнал селл
все верно. дело в логике индикатора. "неправильный" сигнал ли? или неотрисовка "правильного"?
Вы писали:
Я так понял, что сигнал на 0-баре неустойчив, но на 1-баре уже не рисует, и вот теперь оказывается Вы сомневаетесь и в 1-баре...сделка закрывается(причем по нулевому бару). открывается новая сделка в противоположном направление и снова через бар(уже по первому) перекрываться в верном направление.
Если индюк может "передумать" и на 1-баре, то нужно торговать на 2, иначе решения нет...
Можно попробовать ставить короткий СЛ с переворотом, но только до закрытия "входного" бара.
Подскажите, имеется стрелочный индикатор, вот таким образом я обрабатываю сигнал с него
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 обнуляются т.к. нет сигнала, а мне необходимо знать какая стрелка была последней, как это сделать?
Нужна ещё одна переменная, например:мне необходимо знать какая стрелка была последней, как это сделать?
int LastSig = -1; // -1 - сигнала не было
if ( BuySignal ) { LastSig = OP_BUY; .... } //наверняка у Вас есть этот блок - вставьте туда
if ( SellSignal ) { LastSig = OP_SELL; ... }
Нужна ещё одна переменная, например:мне необходимо знать какая стрелка была последней, как это сделать?
int LastSig = -1; // -1 - сигнала не было
if ( BuySignal ) { LastSig = OP_BUY; .... } //наверняка у Вас есть этот блок - вставьте туда
if ( SellSignal ) { LastSig = OP_SELL; ... }
Не совсем понимаю что делать дальше с переменной LastSig
Вы задали вопрос, я предложил решение, а что делать дальше мне не ведомо... это-ж Ваша стратегия торговли. Можно, например, не входить повторно в Бай, если предыдущий сигнал был Бай.Не совсем понимаю что делать дальше с переменной LastSig
Вы задали вопрос, я предложил решение, а что делать дальше мне не ведомо... это-ж Ваша стратегия торговли. Можно, например, не входить повторно в Бай, если предыдущий сигнал был Бай.Не совсем понимаю что делать дальше с переменной 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
Т.е. получаем новый сигнал, но время не то, сигнал запоминаем, дожидаемся нужного времени и только тогда входим по последнему сигналу?логика простая если последняя стрелка 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);
}
}
При тестирований очень медленно все это дело, скажите это зависит от мощности пк или это тестер такой тормознутый? Приходится по тест проводить...
trlolo
бОльшая часть советников работает по индикаторам, либо по свечному анализу. Советников, использующих в логике конкретно тики - единицы...
Отсюда следует, что основная причина тормознутости ботов- это ненужная обработка информации на каждом тике... Кстати, к таковой относится реализация инфопанелей в составе советника, которая показывает в т.ч. спред...
Я не много написал советников, но единственный случай, когда бот реально работал на всех тиках- это закрытие по профиту, либо трал, да и тот, который считает расстояние на каждом тике...
п.с. возможно пропустил еще какую то жизненную ситуацию, где нужно обрабатывать каждый тик.
п.п.с. все написанное не относится к скальперам.
Даже там можно пропускать тики, если дистанция от пред. анализа менее 5 пипс (например).единственный случай, когда бот реально работал на всех тиках- это закрытие по профиту, либо трал, да и тот, который считает расстояние на каждом тике...
Но ведь все равно нужно анализировать... Но за совет- лайк!
бОльшая часть советников работает по индикаторам, либо по свечному анализу. Советников, использующих в логике конкретно тики - единицы...
Отсюда следует, что основная причина тормознутости ботов- это ненужная обработка информации на каждом тике... Кстати, к таковой относится реализация инфопанелей в составе советника, которая показывает в т.ч. спред...
Я не много написал советников, но единственный случай, когда бот реально работал на всех тиках- это закрытие по профиту, либо трал, да и тот, который считает расстояние на каждом тике...
п.с. возможно пропустил еще какую то жизненную ситуацию, где нужно обрабатывать каждый тик.
п.п.с. все написанное не относится к скальперам.
В простеньких роботах да. Но если писать нормальную торговую систему, то надо учитывать, что трейдер может переставить отложку, стопы, закрыть/отменить ордер и это может произойти в любой момент. Поэтому я каждый ордер оборачиваю в класс и на каждом тике контролирую его состояние (есть ли он физически и не поменялись ли его параметры). При этом контролируется только ордера с которыми работает советник. Основная ошибка начинающих в работе с ордерами - это тупо каждый раз искать его среди открытых по Magic, OrderSelect достаточно "дорогая" функция, а если ордеров много, а ваш в конце списка, то вот вам и сотня миллисекунд только на поиск.
Вам встречалось частичное закрытие? Сейчас модно закрыть часть ордера, а другая часть может висеть в рынке с другим тикетом, имхо здесь без цикла с OrderSelect не обойтись. Новичков лучше не сбивать - пусть по старинке через цикл ордера контролируют, тем более 90% не слышали о классах вообще ничего.Основная ошибка начинающих в работе с ордерами - это тупо каждый раз искать его среди открытых по Magic, OrderSelect достаточно "дорогая" функция
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем