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

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

#451

Так добавьте в конструктор счётчик открытый ордеров, если он > 0 то не открывать ордера.)

#452


Всем привет!

Если не заморачиваться, можно отправить советник спать, после открытия ордера. Измерять будем свечками:
ticket = OrderSend(.................)
if (ticket > 0)
{
if (OrderModify(.............))
{
int sleep = timefr*60*1000;
Sleep(sleep);
}
}

timefr - во внешние переменные. Это период графика в минутах (если H1, пишем 60, если H4 - 240).
Если нужно пропустить два бара, пишем sleep = 2*timefr*60*1000;
Теперь, можно ограничить общее количество ордеров: if (CountSell() (например)

Конечно, если во время спячки перезапустить терминал или советник, может установиться ещё один ордер...


Вы говорите ''Если нужно пропустить два бара, пишем sleep = 2*timefr*60*1000;''А как я узнаю сколько нужно пропустить баров? Я ведь не смогу предсказать когда именно появится следующий пин-бар.
Может лучше все так же оставить, а в конце добавить if (buypin == true) sleep = false;, то-есть если появляется новый пин-бар, то сплячку отключаем:
ticket = OrderSend(.................)
if (ticket > 0)
{
if (OrderModify(.............))
{
int sleep = timefr*60*1000;
Sleep(sleep);
if (buypin == true) sleep = false;
}
}
Или так не получится?

А то что если во время спячки перезапустить терминал или советник, может установиться ещё один ордер это точно? Если это так то наверное лучше искать другой вариант.
А может в этом случае написать что-то типа такого: if (цена первого ордера == цене второго ордера) то второй закрыть; ? Или не получится.

Еще. Как написать, что если минимум(в случае pinbuy)) был пробит то отложенный ордер на покупку удаляется?
Я так написала, ничего не получилось:
if (pinbuy == true)
{
if (ticket > 0 && CountBuyStop() > 0 && CountBuy() == 0)
{
if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
{
if (Ask {
OrderDelete (ticket);
}
}
}
}

if (pinsell == true)
{
if (ticket > 0 && CountSellStop() > 0 && CountSell() == 0)
{
if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
{
if (Bid > dhigh)
{
OrderDelete (ticket);
}
}
}
}
#453


А как я узнаю сколько нужно пропустить баров? Я ведь не смогу предсказать когда именно появится следующий пин-бар.



А не нужно узнавать, сколько пропускать баров. Если сов обнаружил пин-бар на предыдущей свече, он выставляет (допустим) отложку. Если ордер установился, срабатывает команда Sleep. В начале следующей свечи он снова проверяет предыдущую и т.д. Двойку, я предложил на случай, если не нужно отрабатывать два пин-бара подряд.
Это был просто пример, а не кусок кода в коммерческий бот :)
#454


Так добавьте в конструктор счётчик открытый ордеров, если он > 0 то не открывать ордера.)



если бы я знал, как это делать. советник мастерил по этому конструктору:
_http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/

MACDMA.mq49 скач.

#455

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

else
{
int order_type = FindLastOrderType();
if (order_type ==OP_BUY)
{
price=FindLastPrice(OP_BUY);
if((Ask S1 && st2 {
lastlot = FindLastLots(OP_BUY);
lastlot = NormalizeDouble(lastlot*Multiplier,2);
ticket = OrderSend(Symbol(),OP_BUY,lastlot,Ask,Slippage,0,0,"",Magic,0,Blue);
if ( ticket > 0)
ModifyOrders( OP_BUY);
}
}


Добавлено: 21-10-2013 08:43:23

всё, я разобрался сам - извините что беспокоил зря

Изменено 21 октября, 2013 пользователем Renjeni

#456

В коде уже есть проверка на открытые позиции, поэтому добавлять не нужно.

В самом коде есть ошибки:
1. Нету проверки на пересечение EMA, есть только проверка что текущее значение EMA5 выше или ниже LWMA. Чтобы проверить пересечение, нужно проверять что на предыдущем баре (shift=1) значение было ниже(выше), а на следущем - поменялось.
2. В самих параметрах индикаторов есть ошибки - в переменной Buy1_2 вместо EMA 5 в одном месте вычисляеться EMA 15
3. Buy2_1 - вместо LWMA вычисляеться SMA

И не понятно что такое 1 бар MACD в описании. Это предыдущий бар ?

MACDMA_fixed.mq414 скач.

#457

А как написать, что если минимум(в случае pinbuy)) был пробит то отложенный ордер на покупку удаляется?

#458


В коде уже есть проверка на открытые позиции, поэтому добавлять не нужно.

В самом коде есть ошибки:
1. Нету проверки на пересечение EMA, есть только проверка что текущее значение EMA5 выше или ниже LWMA. Чтобы проверить пересечение, нужно проверять что на предыдущем баре (shift=1) значение было ниже(выше), а на следущем - поменялось.
2. В самих параметрах индикаторов есть ошибки - в переменной Buy1_2 вместо EMA 5 в одном месте вычисляеться EMA 15
3. Buy2_1 - вместо LWMA вычисляеться SMA

И не понятно что такое 1 бар MACD в описании. Это предыдущий бар ?



благодарю за помощь )
#459

Добрый день! Опять я :)
Просмотрел еще пару раз видео по мартину и внес некоторые изменения, но почемуто открываются 2 ордера на покупку... Подскажите от куда руки растут, в смысле от куда начал неправильно идти:
int start()
{
if (HourStart == TimeHour(TimeCurrent()) && CountBay() == 0)
{
SL1 = NormalizeDouble(Ask - StopLoss*Point, Digits);
TP1 = NormalizeDouble(Ask + StopLoss*Point, Digits);
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slipage, SL1, TP1, Coment, Magic, 0, Blue);

int order_type = FindLastOrderType();
if (order_type == OP_BUY)
{
price = FindLastPrice(OP_BUY);
if (Ask {
SL2 = NormalizeDouble(Ask - StopLoss*Point, Digits);
TP2 = NormalizeDouble(Ask + StopLoss*Point, Digits);
ticket = OrderSend(Symbol(), OP_BUY, Lots * 2, Ask, Slipage, SL2, TP2, Coment, Magic, 0, Blue);
}
}


}
return(0);
}

//+------------------------------------------------------------------+
double FindLastPrice(int otype)
{
double oldopenprice;
int oldticket;
ticket = 0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket>ticket)
{
oldopenprice = OrderOpenPrice();
ticket = oldticket;
}
}
}
}
return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}

#460

Добрый вечер, xbms, у меня очень интересный вопрос.

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

#461

Здравствуйте!
Не могу найти ошибку в своем коде.
Условие - открыть позицию на бай, если между High и Close предыдущего бара меньше 20 пунктов. В тестере открывается так, как не ожидал... Другие условия: свеча не меньше 350 пунктов; восходящая свеча

HL1=iHigh(NULL,0,1)-iClose(NULL,0,1);

if (iHigh(NULL,0,1)- iLow(NULL,0,1)>=350*Point&&HL1iOpen(NULL,0,1))

Почему открылся BUY?


P.S. Опечатался в посте, исправил скобки. Проблема все равно существует

xauusdm5.png

Изменено 26 октября, 2013 пользователем Vitalya

#462


Здравствуйте!
Не могу найти ошибку в своем коде.
Условие - открыть позицию на бай, если между High и Close предыдущего бара меньше 20 пунктов. В тестере открывается так, как не ожидал... Другие условия: свеча не меньше 350 пунктов; восходящая свеча

HL1=iHigh(NULL,0,1)-iClose(NULL,0,1);

if ((iHigh(NULL,0,1)- iLow(NULL,0,1)>=350*Point)&&(HL1iOpen(NULL,0,1)

Почему открылся BUY?




Зачем столько скобок? внутри лишние а в конце не хватило или это описка не знаю!

Вот так не откроет!!!

if(iHigh(NULL,0,1)- iLow(NULL,0,1)>=350*Point && iClose(NULL,0,1)>iOpen(NULL,0,1) && iHigh(NULL,0,1)-iClose(NULL,0,1)


или по короче вот так
if(High[1]- Low[1]>=350*Point && Close[1]>Open[1] && High[1]-Close[1]

Изменено 26 октября, 2013 пользователем elruso

#463

Так а что по моему вопросу, никто не знает?

Автор#464


А как написать, что если минимум(в случае pinbuy)) был пробит то отложенный ордер на покупку удаляется?



просто сравнить цену с pinbuy, и если она ниже (на сколько ниже? это в параметрах, вероятно должно быть вынесено), то удалить отложенный ордер на покупку...
#465


просто сравнить цену с pinbuy, и если она ниже (на сколько ниже? это в параметрах, вероятно должно быть вынесено), то удалить отложенный ордер на покупку...


Так я это и так знаю, только как это написать в коде?
Автор#466



просто сравнить цену с pinbuy, и если она ниже (на сколько ниже? это в параметрах, вероятно должно быть вынесено), то удалить отложенный ордер на покупку...


Так я это и так знаю, только как это написать в коде?


да в общем-то несложно...
я не смотрел этих индикаторов, но примерно так:

if ((Ask + Pips*Point) {
DeleteStopOrder(); //-- тут функция удаления стоп-ордера
}

Pips - это переменная в параметрах, в пунктах... на сколько должна быть ниже pinbuy

в общем, как-то так...
#467

Вот, посмотрите, может так:
if(pinsell == true)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
{
if(OrderMagicNumber() == Magic && OrderType() == OP_SELLSTOP)
{
if(CountSellStop() > 0)
{
if(Bid == dhigh)
OrderDelete(ticket);
}
}
}
}

if(pinbuy == true)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
{
if(OrderMagicNumber() == Magic && OrderType() == OP_BUYSTOP)
{
if(CountBuyStop() > 0)
{
if(Ask == dlow)
OrderDelete(ticket);
}
}
}
}

Автор#468
Цитата

if(Bid == dhigh)
if(Ask == dlow)



в этих местах слишком жёстко... котировки могут "проскочить" как минимум на 1 пункт и тогда ой :)
лучше писать "=" , зависит от условия...
#469


Цитата

if(Bid == dhigh)
if(Ask == dlow)



в этих местах слишком жёстко... котировки могут "проскочить" как минимум на 1 пункт и тогда ой :)
лучше писать "=" , зависит от условия...


Ага, поняла, ну а в целом правильно написала?
Автор#470
Цитата


Ага, поняла, ну а в целом правильно написала?



по синтаксису всё верно, но по логике ничего не могу сказать... я не смотрел ваших индикаторов...
#471

А почему у меня при тестировании высвечивается в журнале ошибка 130?
Вот мой стоп-лосс в коде советника:
int init()
{
if(Digits == 3 || Digits == 5)
StopLoss *= 10;

return(0);
}



if(pinbuy == true) SL = NormalizeDouble(dlow - StopLoss * Point, Digits);

if(pinsell == true) SL = NormalizeDouble(dhigh + StopLoss * Point, Digits);

Автор#472


А почему у меня при тестировании высвечивается в журнале ошибка 130?
Вот мой стоп-лосс в коде советника:
int init()
{
if(Digits == 3 || Digits == 5)
StopLoss *= 10;

return(0);
}

if(pinbuy == true) SL = NormalizeDouble(dlow - StopLoss * Point, Digits);

if(pinsell == true) SL = NormalizeDouble(dhigh + StopLoss * Point, Digits);



не ясно как вычисляются dlow и dhigh... скорее всего неправильно, ибо ошибка 130 - это неправильные стопы.
#473

double dlow = Low [1]; // Минимум предыдущего бара
double dhigh = High [1]; // Максимум предыдущего бара

Автор#474


double dlow = Low [1]; // Минимум предыдущего бара
double dhigh = High [1]; // Максимум предыдущего бара



а не проще выложить целиком файл, дабы не гадать где, что и как... ?
#475

Хочу написать советник с использованием индикатора Stochastic oscillator. Так же хочу чтобы в рынок осуществлялся при условии медвежьей и бычьей дивергенции. В основном меня это интересует, кто может помочь?

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

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