Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 218
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Дополнил Ваш код блоком открытия ордера объемом 0.1 ( сразу после функции void start()
Но почему то программа не открывает в ответ на закрытие этих ордеров никаких ордеров увеличенного объема( по 0.3. лота)
МОМЕНТЫ КОТОРЫЕ Я НЕ ПОНИМАЮ В ВАШЕМ КОДЕ
1. Если я правильно понял МН=123 Вы присваиваете только ордерам объемом 0.3.
В функции datetime SearTim(int s) Вы ищете ордер с МН=123 , но с объемом 0.1
Но ведь ордер с объемом 0.1 не может иметь МН=123 потому что этот МН присваивается только ордерам с объемом 0.1
2.В телах функцй datetime SearTim(int s) и int sear() , а точнее в комментариях - указано на необходимость открытия ордера объемом 0.3
Не понимаю зачем открывать ордера с увеличенным объемом при одних и тех же условиях больше одного раза.
Ведь Вы же открыли уже ордера с увеличенным объемом в первом блоке
Буду Вам очень признателен если Вы напишете код, который бы после закрытия каждого ордера объемом 0.1 открывал ордер объемом 0.3 и сохранял значение часа открытия ордера объемом 0,1
В этом случае я приложу все усилия что бы при помощи функции Print (), своих пока скромных познаний и справочной литературы найти в вашем коде все ответы на свои вопросы.
ПРИМЕЧАНИЕ:
У меня все ордера и объемом 0.1 и объемом 0.3 одного типа - только СЕЛ. Поэтому, если я не ошибаюсь, в функции int sear() может быть вычислять тип ордера( БАЙ или СЕЛ) не нужно.
Еще раз напоминаю,что конечная цель моей программы - запомнить значения часа (не минуты, не секунды, а только часа)открытия ордера объемом 0.1 после того , как открытый по цене его закрытия ордер объемом 0.3 закрылся по СЛ
Я извиняюсь, что не могу вам многого объяснить, потому как вы должны знать язык программирования. Я думал, что вы уже что-то программируете и расчитывал на человека знающего программирование.
Вам нужно сначала изучить программирование. Если я буду вам объяснять что и как, то это будет обучение языку программирования.
Посмотрите примеры советников, как они пишутся и пробуйте писать программы с самого малого. А вы стараетесь написать программу уже сложную.
Вот посмотрите учебник и примеры написания комманд и примерных модулей.
Обращаюсь с таким несложным вопросом, Вот блок закрытия.
Когда прибыль ордера становится положительной, он закрывает этот ордер и на эту всю прибыль сколько можно убыточной позиции. Если включен Perekr.
Нужно изменить так, чтобы он закрвал обе позиции, только когда прибыль прибыльной позиции покроет ВЕСЬ убыток убыточной, то есть чтобы профит одного ордера был равен или больше убытка другого.
if(Mas_Tip[1]>0)
{
if(Bidt-step*Point>=NormalizeDouble(Bid,Digits))
{
Profit=AccountBalance()-StartProfit;
Askt=NormalizeDouble(Ask,Digits);
Bidt=NormalizeDouble(Bid,Digits);
for(int i=1; i<=OrdersTotal(); i++)
{
if(OrderSelect(i-1,SELECT_BY_POS)==true && OrderType()==OP_SELL &&
OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(Razn<2)
{
if(Perekr && OrderProfit()>0 && max_lot>=Lots_per) //перекрытие
{
double profit=OrderProfit();
Print("закрываю по перекрытию");
ClosePosBySelect(OrderLots());
for(int f=OrdersTotal()-1;f>=0;f--)
{
if(OrderSelect(f,SELECT_BY_POS)==true && OrderType()==OP_BUY &&
OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderProfit()<0)
{
if(profit>=MathAbs(OrderProfit()))
{
Print("закрываю по перекрытию");
ClosePosBySelect(OrderLots());
}
Друзья, привет. Помогите новичку.
Хочу чтоб при пересечении какого-либо индикатора ценой, мне отправлялось сообщение на емайл об этом. Вроде разобрался как это сделать, но как только наступает это пересечение, то емайлы отправляют сотнями бесконечно, пока не закроется текущая свеча. Что сделать чтоб отправлялось только одно сообщение? Вот пример:
if((iSAR(NULL, 0,Step,Maximum, 1)<iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)>iClose(NULL,0,2))){
bool res = SendMail("Сигнал на покупку", "Сигнал на покупку");
}
if((iSAR(NULL, 0,Step,Maximum, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)<iClose(NULL,0,2))){
SendMail("Сигнал на продаж", "Сигнал на продажу");
}
Друзья, привет. Помогите новичку.
Хочу чтоб при пересечении какого-либо индикатора ценой, мне отправлялось сообщение на емайл об этом. Вроде разобрался как это сделать, но как только наступает это пересечение, то емайлы отправляют сотнями бесконечно, пока не закроется текущая свеча. Что сделать чтоб отправлялось только одно сообщение? Вот пример:
if((iSAR(NULL, 0,Step,Maximum, 1)<iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)>iClose(NULL,0,2))){
bool res = SendMail("Сигнал на покупку", "Сигнал на покупку");
}
if((iSAR(NULL, 0,Step,Maximum, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)<iClose(NULL,0,2))){
SendMail("Сигнал на продаж", "Сигнал на продажу");
}
С параболиком всё просто, поставь флаг в условие. Или простую переменную типа int и значение меняется с каждым сигналом.
Всем доброго времени суток! Будьте добры, помогите разобраться с Trailing Stop. Написал советнику Трейлинг, при условии, что изначально есть SL = 100, а Трейлинг должен срабатывать, когда цена находится выше открытия позиции на 30 пунктов. Он же модифицирует сразу после открытия позиции и меняет стандартный SL на 30 и уже потом передвигает.
void Trailing()
{
int SLoss = 1;
double StopL = NormalizeDouble (OrderOpenPrice() + SLoss*Point, Digits);
double StopL2 = NormalizeDouble (OrderOpenPrice() - SLoss*Point, Digits);
for (int i=OrdersTotal() - 1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY && OrderStopLoss() >= StopL)
{
if (Bid - StopL > TrailingStop*Point)
{
if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep)*Point)
{
if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*Point, Digits), 0, 0))
Print("Ошибка модификации ордера на продажу!");
}
}
}
if (OrderType() == OP_SELL && OrderStopLoss() <= StopL2)
{
if (StopL2 - Ask > TrailingStop*Point)
{
if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep)*Point)
{
if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*Point, Digits), 0, 0))
Print("Ошибка модификации ордера на продажу!");
}
}
}
}
}
}
}
С параболиком всё просто, поставь флаг в условие. Или простую переменную типа int и значение меняется с каждым сигналом.
Всем доброго времени суток! Будьте добры, помогите разобраться с Trailing Stop. Написал советнику Трейлинг, при условии, что изначально есть SL = 100, а Трейлинг должен срабатывать, когда цена находится выше открытия позиции на 30 пунктов. Он же модифицирует сразу после открытия позиции и меняет стандартный SL на 30 и уже потом передвигает.
...Только про else забыл - иначе статическая переменная так и останется в true после первого сигнала
Зачем там ельза? По-моему достаточно flag == true; или flag == false; что и есть в коде
При пересечении в одну сторону ждём пересечения в другую... и так замкнутый цикл. А вот как правильно подключить при первом запуске, пусть думает сам. Или потом спросит...
Зачем там ельза? По-моему достаточно flag == true; или flag == false; что и есть в коде
При пересечении в одну сторону ждём пересечения в другую... и так замкнутый цикл. А вот как правильно подключить при первом запуске, пусть думает сам. Или потом спросит...
Если два сигнала на разных барах в одну сторону?
У тебя получается только свинг.
Но ведь сигналы должны отсылаться всегда при наличии сигнала, а вот решение сигналить уже принимается отдельно.
Мне кажется, что для каждого из направлений оптимально иметь свой флаг, и его-то и переключать туда-сюда. Но не так, чтобы сигналы одного направления зависели от сигналов противоположного направления.
Если два сигнала на разных барах в одну сторону?
У тебя получается только свинг.
Но ведь сигналы должны отсылаться всегда при наличии сигнала, а вот решение сигналить уже принимается отдельно.
Мне кажется, что для каждого из направлений оптимально иметь свой флаг, и его-то и переключать туда-сюда. Но не так, чтобы сигналы одного направления зависели от сигналов противоположного направления.
Артём, я не зря начал ответ со слов
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Alexey Viktorov, 2017.05.29 08:09
С параболиком всё просто,
у параболика строгое чередование, два сигнала в одну сторону даже на разных барах невозможны. И для этого совсем не надо ничего изобретать, он даже на нулевом баре, как МА не дребезжит.