Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 218

 
a196012a:

Дополнил Ваш код блоком открытия ордера объемом 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 закрылся по СЛ


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

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

Посмотрите примеры советников, как они пишутся и пробуйте писать программы с самого малого. А вы стараетесь написать программу уже сложную.

Вот посмотрите учебник и примеры написания комманд и примерных модулей.

Файлы:
MQL4.zip  2226 kb
 

Обращаюсь с таким несложным вопросом, Вот блок закрытия. 

Когда прибыль ордера становится положительной,   он закрывает этот ордер и на эту всю прибыль сколько можно убыточной позиции.   Если включен 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("Сигнал на продаж",  "Сигнал на продажу");

 }

 
ev85:

Друзья, привет. Помогите новичку.

Хочу чтоб при пересечении какого-либо индикатора ценой, мне отправлялось сообщение на емайл об этом. Вроде разобрался как это сделать, но как только наступает это пересечение, то емайлы отправляют сотнями бесконечно, пока не закроется текущая свеча. Что сделать чтоб отправлялось только одно сообщение? Вот пример:

 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 и значение меняется с каждым сигналом.

static bool flag;
 if(flag && iSAR(NULL, 0,Step,Maximum, 1) < iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) > iClose(NULL,0,2)){

 bool res = SendMail("Сигнал на покупку",  "Сигнал на покупку");
 flag = false;
 }


 if(!flag && iSAR(NULL, 0,Step,Maximum, 1) > iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) < iClose(NULL,0,2)){

 SendMail("Сигнал на продаж",  "Сигнал на продажу");
 flag = true;
 }
 

Всем доброго времени суток! Будьте добры, помогите разобраться с 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("Ошибка модификации ордера на продажу!");

                  }

               }

            }

         }

      }

   }

}

 
Alexey Viktorov:

С параболиком всё просто, поставь флаг в условие. Или простую переменную типа int и значение меняется с каждым сигналом.

Только про else забыл - иначе статическая переменная так и останется в true после первого сигнала
 
AlGuru:

Всем доброго времени суток! Будьте добры, помогите разобраться с Trailing Stop. Написал советнику Трейлинг, при условии, что изначально есть SL = 100, а Трейлинг должен срабатывать, когда цена находится выше открытия позиции на 30 пунктов. Он же модифицирует сразу после открытия позиции и меняет стандартный SL на 30 и уже потом передвигает.

...
Может поможет? Там я выкладывал шаблон, из которого сами себе можете что хотите сделать.
 
Artyom Trishkin:
Только про else забыл - иначе статическая переменная так и останется в true после первого сигнала

Зачем там ельза? По-моему достаточно flag == true; или flag == false; что и есть в коде

if(flag && ****

if(!flag && ****

При пересечении в одну сторону ждём пересечения в другую... и так замкнутый цикл. А вот как правильно подключить при первом запуске, пусть думает сам. Или потом спросит...

 
Alexey Viktorov:

Зачем там ельза? По-моему достаточно flag == true; или flag == false; что и есть в коде

При пересечении в одну сторону ждём пересечения в другую... и так замкнутый цикл. А вот как правильно подключить при первом запуске, пусть думает сам. Или потом спросит...

Если два сигнала на разных барах в одну сторону?

У тебя получается только свинг.

Но ведь сигналы должны отсылаться всегда при наличии сигнала, а вот решение сигналить уже принимается отдельно.

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

 
Artyom Trishkin:

Если два сигнала на разных барах в одну сторону?

У тебя получается только свинг.

Но ведь сигналы должны отсылаться всегда при наличии сигнала, а вот решение сигналить уже принимается отдельно.

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

Артём, я не зря начал ответ со слов

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