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

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

#5076
KriKs-Fx у функций есть "вызов" и "тело-описание", так вот тело должно описываться за скобками основной функции - на пустом месте, например:
void OnTick()
{
//здесь вызываем функцию CountBuy()
if ( Ask .....
} - закрывающая скобка основной функции ( скобки - очень важная часть MQL )

int CountBuy() { ... здесь описание функции - её тело, заканчивается - return( N ); } - закрывающая скобка функции
#5077

Благодарю Вас Oll с скобками я действительно лоханулся. Ошибок больше нет. Но в тесторе на любом ДЦ сова выставляет только один ордер без SL and TP И всё.. дальше ступор. И предупреждения... OrderModify (ticket,OrderOpenPrice(),SL,TP,0); и предупреждение return value of 'OrderModify' should be checked. OrderSelect(trade,SELECT_BY_POS,MODE_TRADES); предупреждение...return value of 'OrderSelect' should be checked

#5078
KriKs-Fx предупреждения можно игнорировать, если мешают, создайте переменную bool hren; и все функции, требующие контроля, вызывайте так:
hren = OrderSelect(...); и предупреждений не будет.
По поводу 1 ордера - добейтесь выставления СЛ/ТП и будут другие ордера, проверьте правильность расчёта СЛ/ТП
#5079

Доброго времени суток, столкнулся с ошибкой, не закрывает на обратный сигнал, НИКАК не увижу, прошу помощи

///условия открытия

if(CountSell()==0 && Bid Bid SD163 - max_indent*Point)//lastBarTime != Time[0]
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
if (ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);

if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка на продажу");
}
}
if(CountBuy()==0 && Ask > SD163 && BuySignal()==true &&
Bid >= SD163 + min_indent*Point && Bid {
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Sloper", Magic, 0, Blue);
if (ticket>0)
{
TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
SL = NormalizeDouble(Ask - StopLoss*Point, Digits);

if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка на покупку");
}
}
//условия обратного сигнала
if(z==true)
{
if ( CountSell()>0 && Ask > SD163 && BuySignal()==true &&
Bid >= SD163 + min_indent*Point && Bid {
for(int i = OrdersTotal() -1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderType() == OP_SELL )
if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
Print("Ошибка");
}
}
}
if ( CountBuy()>0 && Bid Bid SD163 - max_indent*Point)
{
for(int i = OrdersTotal() -1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
Print("Ошибка");
}
}
}
}


Добавлено: 21-04-2018 07:03:14

Как такое может быть в будни работает, в выходные нет???

Изменено 21 апреля, 2018 пользователем d1w4m3

#5080

Может из-за расширения спреда в тестере? ведь у Вас в условиях:
Ask > SD163 , а Bid

#5081

я и без пробовал

if(CountSell() == 0  &&  SellSignal()==true)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
if (ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);

if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка на продажу");
}
}
if( CountBuy() == 0 && BuySignal()==true)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Sloper", Magic, 0, Blue);
if (ticket>0)
{
TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
SL = NormalizeDouble(Ask - StopLoss*Point, Digits);

if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка на покупку");
}
} //условия обратного сигнала
if(z==true)
{
if ( CountSell()>0 && BuySignal()==true )
{
for(int i = OrdersTotal() -1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderType() == OP_SELL )
if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
Print("Ошибка");
}
}
}
if ( CountBuy()>0 && SellSignal()==true)
{
for(int i = OrdersTotal() -1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
Print("Ошибка");
}
}
}
}
********************
bool SellSignal()
{
//если последний столбик красный, а предпоследний зеленый
if(Reds(1)!=EMPTY_VALUE && (Blacks(2)!=EMPTY_VALUE || Greens(2)!=EMPTY_VALUE)) return(true);

else return (false);
}
bool BuySignal()
{
//если последний столбик зеленый, а предпоследний красный
if(Greens(1)!=EMPTY_VALUE && (Blacks(2)!=EMPTY_VALUE || Reds(2)!=EMPTY_VALUE)) return(true);

else return (false);


Добавлено: 21-04-2018 12:28:43

Я сейчас монитр разобью, сейчас заработал, да что это такое............

Изменено 21 апреля, 2018 пользователем d1w4m3

#5082

В OrderClose для Sell - Ask, для Buy - Bid.

#5083

^:)^ ^:)^ ^:)^ ^:)^ ^:)^ ^:)^ ^:)^ ^:)^ ^:)^ ^:)^ ^:)^


Добавлено: 21-04-2018 12:54:45

получается - это все из за спреда, ппц спасибо вам ребята
#5084

Новый урок:
http://tradelikeapro.ru/mql4-logirovanie-sobyitiy-dlya-ea/

#5085

альтернативный вариант закрытия ордера в сове работающей по Trailing-stop на примере урока № 5.

там ситуация следующая, по условию if (CountBay() + CountSell() == 0 && Bid >= maprice) открывается ордер и срабатывает следующая ф-ция Trailing (). по которой и происходит закрытия ордера.

а хотелось бы получить в общем такой вариант, что бы было двойное условие выхода: по Trailing (), но пока не выпадет дополнительное условия на выход Bid
попробовал например так, но не сработало:

Спойлер

...
if (CountBay() + CountSell() == 0 && Bid >= maprice && last_type != OP_BUY )
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippadge, 0,0,"РОБОТ", Magic, Blue);
if (ticket > 0)
Print ("ошибка открытия ордера на бая");
}

//------------------- + закрытие

while( Bid >= maprice)
Trailing ();

if (Bid 0 )
{
for(int i = OrdersTotal() -1; i>=0; i-- )
{
if ( OrderSelect( i,SELECT_BY_POS, MODE_TRADES))
{
if ( OrderMagicNumber() == Magic && OrderType()== OP_BUY )
if (! OrderClose( OrderTicket(), OrderLots(), Bid , Slippadge, Black ))
Print("ошибка закрытия ордера на покупку");

}}}


...
но вопрос вроде как решился
поставив ф-ции на закрытие:
Спойлер

...
Trailing ();
close_OP_BUY();
close_OP_SELL();
//----------

void close_OP_BUY()
{
if (Bid 0 )
{
for(int i = OrdersTotal() -1; i>=0; i-- )
{
if ( OrderSelect( i,SELECT_BY_POS, MODE_TRADES))
{

if ( OrderMagicNumber() == Magic && OrderType()== OP_BUY )
if (! OrderClose( OrderTicket(), OrderLots(), Bid , Slippadge, Black ))
Print("ошибка закрытия ордера на покупку");


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


но висит еще такая идея как совместить сл, тп и Trailing(). например работает Trailing() и при достижение проеденного кол -ва пунктов он выходил бы из сделки в любой ситуации. то есть наверное надо как то задать что бы на каком то его Trailing() уровне, шаг -TralingStep стал = 0. наверное так, я так понимаю?

урок_№5.mq42 скач.

Изменено 23 апреля, 2018 пользователем 0ll

#5086

например работает Trailing() и при достижение проеденного кол -ва пунктов он выходил бы из сделки в любой ситуации. то есть наверное надо как то задать что бы на каком то его Trailing() уровне, шаг -TralingStep стал = 0. наверное так, я так понимаю?

Я думаю если цена прошла заданное кол-во пунктов, надо не тралом заморачиваться, а просто закрыть ордер.
и в Вашем коде ошибочка:
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippadge, 0,0,"РОБОТ", Magic, Blue);
if (ticket > 0)
Print ("ошибка открытия ордера на бая");
когда тикет > 0 - это значит открылся ордер, а вот когда
#5087

Хочу сам написать индикатор (MQL4), но данные для массивов надо брать из web-ресурса. Подскажите что почитать, где поюзать???

#5088


Хочу сам написать индикатор (MQL4), но данные для массивов надо брать из web-ресурса. Подскажите что почитать, где поюзать???


1-й вариант функции webrequest
#5089

Добрый день. Надеюсь пишу по адресу. Опишу ситуацию: пишу советника который открывал бы ордера по показаниям индикаторов и закрывал бы позиции через определенное время. Так вот в какой то момент на тестах советник стал открывать только один ордер за весь период и закрывает его. Думал косяк в коде(возможно и в коде тоже), нашел и скачал сторонний советник частично похожий, так и он на тесте открывает и закрывает только один ордер за весь период тестирования, ордер открытия на обоих советниках только buy. Может это быть косяком компилятора или МТ4?

#5090
Sacred70 т.е. сначала всё открывалось, а потом перестало? Трудно что-то сказать, у меня такого не было...
#5091
0ll да, сначала открывалось как надо, единственное закрывалось раньше, а сейчас так же раньше, но только один ордер открывается, тусовал строки по разному, менял местами блоки, в любом порядке кода открывается только buy. Попутно вопрос: существует ли МТ4 без привязки к брокеру, чтобы избежать косяков со сборкой брокера?
#5092

У нас на форуме есть коллекция чистых билдов МТ4 с практически до-исторических времён :d
читать здесь

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

#5093
0llСпасибо
еще вопрос)): как проще прописать в условии индикатора серию из свечей одного направления(например 5 черных свечей)? первое что пришло на ум Open[n]>Close[n], но это долго и объемно получается.
и сразу еще вопросик: какие существуют варианты вывода сигнала индикатора, а именно запись в файл?

Изменено 2 мая, 2018 пользователем Sacred70

#5094
Sacred70 У Вас идут свечи одна за другой, ведь по другому ни как - значит просто поставьте счётчик, типа:
if ( Close[1] > Open[1] ) { countB++; countS = 0; }
else { countS++; countB = 0; }
а теперь анализируем счётчики
if ( countB == 5 ) // делаем что-то
#5095
0ll спасибо, прикрутил, все работает отлично, еще бы замутить чередование ордеров
#5096

еще бы замутить чередование ордеров

Это вопрос или мечта и сами справитесь?
#5097

был бы признателен если дадите направление куда копать

#5098

самое простое решение это сохранить направление последнего открытого ордера или тикет (если потом мартина прикручивать)
добавьте глобальную переменную int lastType = -1;
Когда открываете ордер (BUY) делаете проверку if ( lastType != OP_BUY ) { открываем Бай ...; lastType = OP_BUY; }

#5099

Здравствуйте.

Подскажите, как подключить индикатор MovingAverage, не к графику цены, а к индикатору что находится в "подвале".

Спасибо.

#5100

Привет! Подскажите как в коде обрисовать ситуацию : есть некий гэп и далее цена проходит определенное расстояние в пунктах.

Спойлер

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

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

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