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

 
 int x=0;
 int scale_mas[13]={0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096};//объявление массива

 for(int i=0;i < ArraySize(scale_mas);i++){
    if(x == scale_mas[0])x = scale_mas[1];                       //если х=индекс0, то х=индекс1
    if(x >= ArraySize(scale_mas))x = scale_mas[11];              //если х>= размер массива, то х=индекс11
    i=x;
    if(ObjectGetInteger(0, "Button+", OBJPROP_STATE) == false){  //если кнопка "+" нажата
       i=i+1;                                                    //увеличиваем индекс на 1
       ObjectSetInteger(0, "Button+", OBJPROP_STATE,true);}
                        
    x=i;							 //присваиваем х значение последнего индекса
    if(ObjectGetInteger(0, "Button-", OBJPROP_STATE) == false){  //если кнопка "-" нажата
       i=i-1;                                                    //уменьшаем индекс на 1
    ObjectSetInteger(0, "Button-", OBJPROP_STATE,true);}
                            
    x=i;                                                         //присваиваем х значение последнего индекса
 ObjectSetString(0,"=TrendLine",OBJPROP_TEXT,scale_mas[x]);}}    //выводим результат scale_mas[x]
Вчера написал код, вроде он работает как надо, но только, когда кнопкой плюс дохожу до крайнего значения массива, то идет сброс на начало массива и перемещение вверх по нему заново. Что можно добавить или исправить в коде, чтобы, когда доходит до верхнего значения массива дальнейшие клики на кнопку плюс останавливались на верхнем индексе и не было сброса вниз массива? Или для реализации этой идеи с нажатием на кнопки код можно ещё как-то упростить?
 
Ivan Revedzhuk:
Вчера написал код, вроде он работает как надо, но только, когда кнопкой плюс дохожу до крайнего значения массива, то идет сброс на начало массива и перемещение вверх по нему заново. Что можно добавить или исправить в коде, чтобы, когда доходит до верхнего значения массива дальнейшие клики на кнопку плюс останавливались на верхнем индексе и не было сброса вниз массива? Или для реализации этой идеи с нажатием на кнопки код можно ещё как-то упростить?
if(x >= ArraySize(scale_mas))
 ArraySize(scale_mas)-1;              //если х>= размер массива, то ....

Наверное так.

 
Alexey Viktorov:

Наверное так.

так тоже пробовал, работает так же

 
Ivan Revedzhuk:

так тоже пробовал, работает так же

Я не сразу заметил, а цикл-то там зачем?

 
Alexey Viktorov:

Я не сразу заметил, а цикл-то там зачем?

а без него разве как-то можно? Я просто не знаю как лучше и делаю как думаю исходя из логики.

 
Ivan Revedzhuk:

а без него разве как-то можно? Я просто не знаю как лучше и делаю как думаю исходя из логики.

Ну так логика должна быть другая наверное. Нажал кнопку+ уветичился индекс массива. Дошёл до максимума, не увеличивает, а остаётся на максимальном. Нажал кнопку- индекс уменьшился. Дошёл до нуля, не реагирует на нажатие, оста1тся на индексе 0.

Или какая-то другая задумка была?

PS; А кто выкладывал пример работы с флагами, в ответ на этот вопрос и удалил его? Зачем удалили? Ведь это действительно хорошее решение человеку. Зачем ему ограниченный массив???
 
Alexey Viktorov:

Ну так логика должна быть другая наверное. Нажал кнопку+ уветичился индекс массива. Дошёл до максимума, не увеличивает, а остаётся на максимальном. Нажал кнопку- индекс уменьшился. Дошёл до нуля, не реагирует на нажатие, оста1тся на индексе 0.

Или какая-то другая задумка была?

PS; А кто выкладывал пример работы с флагами, в ответ на этот вопрос и удалил его? Зачем удалили? Ведь это действительно хорошее решение человеку. Зачем ему ограниченный массив???

нет, именно такая задумка и была. Я не особо представляю как это сделать правильно, поэтому сделал как получилось. Но я заметил, что при работе цикла в программе, пока цикл не прощелкаю нажимая на кнопки на графике, всё остальное не работает. Как будто ставится всё на паузу. Почему так происходит не понятно.  Если есть варианты как-то реализовать идею по-другому, буду признателен...

 

Всё. Задачу решил) без массивов и прочего разного. Оказалось всё куда проще)))

Второй вопрос созрел. Как в коде можно установить уровень срабатывания Alert с установкой стрелочки, которая появляется, когда Alert устанавливается через контекстное меню мышкой?

Вопрос по Алерту

 

Помогите, плз, можно ли добавить к этому советнику такую функцию, чтобы советник установленный в окне  EURUSD открывал сделку с такими же параметрами открытия,в то же время, но  по GBPUSD, а по EURUSD  не открывал.

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| Разработчик: Минаев Андрей                                                                                                                      |

//| Советник:    Stochastic.mq4                                                                                                                     |

//| Сайт:        safe-forex.ru                                                                                                                      |

//| Почта:       minaev.work@mail.ru                                                                                                                |

//| Скайп:       live:minaev.work                                                                                                                   |

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

#property copyright "Safe-Forex.ru"

#property link      "https://safe-forex.ru"

#property strict


extern bool      Use_Symbol1   = true;

extern string    Symbol1       = "USDJPY";


input string         settings      = "";          // Настройки советника

input int            magic         = 111;         // Магик

input double         fixVolume     = 0.01;         // Объем

input int            takeProfit    = 500;          // Прибыль

input int            stopLoss      = 500;          // Убыток

input int            buyLevel      = 100;          //  25  Уровень покупки

input int            sellLevel     = 0;          //  75   Уровень продажи


extern int           ADXperiod     =15;                      //ADX period             15

extern int           ADXLevel      =1;


extern int           MAperiod      =360;                       //MA period            80

extern int           MAperiod_2      =360;                       //MA period            80



input string         stochSettings = "";          // Настройки индикатора Stochastic Oscillator

input int            stochPeriodK  = 5;           // Период %K

input int            stochPeriodD  = 3;           // Период %D

input int            stochSlowing  = 3;           // Замедление

input ENUM_STO_PRICE stochPrice    = STO_LOWHIGH; // Цены

input ENUM_MA_METHOD stochMethod   = MODE_SMA;    // Метод


datetime newCandle;     // новая свеча на текущем графике

bool     allowOpenBuy,  // разрешение открыть позицию Buy

         allowOpenSell; // разрешение открыть позицию Sell

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

int OnInit(void)

{

   return INIT_SUCCEEDED;

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

void OnDeinit(const int reason)

{

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

void OnTick(void)

{

   if(newCandle!=Time[0]) CheckSignalExist(); newCandle=Time[0];

   

   if(allowOpenBuy) OpenPosition(OP_BUY);

   if(allowOpenSell) OpenPosition(OP_SELL);

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| Функция открывает позицию по текущей цене                                                                                                       |

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

void OpenPosition(int type)

{

 

 


 

 

 

 

 

 

   double price=0.0;

   if(type==OP_BUY) price=Ask;

   if(type==OP_SELL) price=Bid;

   

  int ticket=OrderSend(_Symbol,type,fixVolume,price,0,0,0,"",magic,0);

  // int ticket=OrderSend(,type,fixVolume,price,0,0,0,"",magic,0);

  

    Sleep(1000);

   if(ticket>0)

   {

      if(type==OP_BUY)

      {

         Print("Открылась позиция Buy, тикет: ",ticket);

         allowOpenBuy=false;

   //      SetStopOrders(ticket);

      }

      if(type==OP_SELL)

      {

         Print("Открылась позиция Sell, тикет: ",ticket);

         allowOpenSell=false;

    //     SetStopOrders(ticket);

      }

   }

   if(ticket<0)

   {

      if(type==OP_BUY) Print("Позиция Buy не открылась, ошибка: ",GetLastError());

      if(type==OP_SELL) Print("Позиция Sell не открылась, ошибка: ",GetLastError());

   }

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| Функция устанавливает стоп ордера                                                                                                               |

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//void SetStopOrders(int ticket)

//{

 //  double stopLevel=MarketInfo(_Symbol,MODE_STOPLEVEL),

  //        spread   =MarketInfo(_Symbol,MODE_SPREAD),

 //         tp       =takeProfit,

   //       sl       =stopLoss;

  

 //  stopLevel+=spread;

   

//   if(tp<stopLevel)

 //  {

 //     tp=stopLevel;

 //     Print("Установлена минимальная дистанция для прибыли");

 //  }

 //  if(sl<stopLevel)

 //  {

//      sl=stopLevel;

 //     Print("Установлена минимальная дистанция для убытка");

 //  }

 //  if(OrderSelect(ticket,SELECT_BY_TICKET))

  // {

  //    int    type=OrderType();

  //    double opp =OrderOpenPrice();

      

  //    if(type==OP_BUY)  {tp=opp+tp*_Point; sl=opp-sl*_Point;}

   //   if(type==OP_SELL) {tp=opp-tp*_Point; sl=opp+sl*_Point;}

      

    //  if(OrderModify(ticket,opp,sl,tp,0))

   //   {

   //      if(type==OP_BUY) Print("Установились уровни прибыли и убытка для позиции Buy, тикет: ",ticket);

   //      if(type==OP_SELL) Print("Установились уровни прибыли и убытка для позиции Sell, тикет: ",ticket);

  //    }

   //   else {

   //      if(type==OP_BUY) Print("Уровни прибыли и убытка для позиции Buy не установились, тикет: ",ticket,", ошибка: ",GetLastError());

   //      if(type==OP_SELL) Print("Уровни прибыли и убытка для позиции Sell не установились, тикет: ",ticket,", ошибка: ",GetLastError());

   //   }

 //  }

//}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| Функция проверяет наличие сигнала                                                                                                               |

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

void CheckSignalExist(void)


{

  

 

   double  ADX1=iADX(Symbol(),Period(),ADXperiod,0,MODE_MAIN,1);                                  ////////////////////////////

  double  ADX2=iADX(Symbol(),Period(),ADXperiod,0,MODE_MAIN,2);

  double DPLUS=iADX(Symbol(),Period(),ADXperiod,0,MODE_PLUSDI,1);

  double DMINUS=iADX(Symbol(),Period(),ADXperiod,0,MODE_MINUSDI,1);

 

   double MA=iMA(Symbol(),Period(),MAperiod,0,MODE_SMA,0,1);

   double MA_2=iMA(Symbol(),Period(),MAperiod_2,0,MODE_SMA,0,1);


 //PERIOD_H1

   double mainLine1=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_MAIN,1),

          mainLine2=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_MAIN,2),

          signLine1=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_SIGNAL,1),

          signLine2=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_SIGNAL,2);

   

 

   Comment("              ", (Ask-Bid)/1.5,"         ",Bid-Close[1],"     ", Ask-Close[1]);

  

 

 //  if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel

 //  && iClose(Symbol(),Period(),1)>MA&& iClose(Symbol(),Period(),1)>MA_2 && signLine1<buyLevel && signLine2<buyLevel

  

    if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel

  // &&Close[2]<MA&& Close[2]<MA_2 && signLine1<buyLevel && signLine2<buyLevel

 

   &&Close[10] >  Close[1]-(Close[1]-Close[20])

  

            && Close[10]>Bid )

    

   {

     

 

      Print("Появился сигнал для открытия позиции Buy");

      if(GetPositionsNumber()==0)

      {

   //    allowOpenSell=true;                                                        

   

    

      allowOpenBuy=true;

    

    

     Sleep(1000);

    

    

         Print("Разрешено открыть позицию Buy");

      }

   }

 //  if(mainLine1<signLine1 && mainLine2>signLine2 && mainLine1>sellLevel && ADX1>ADXLevel&& mainLine2>sellLevel

 //  && iClose(Symbol(),Period(),1)<MA&& iClose(Symbol(),Period(),1)<MA_2 && signLine1>sellLevel && signLine2>sellLevel

     if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel

 //  &&Close[2]>MA&& Close[2]>MA_2 && signLine1<buyLevel && signLine2<buyLevel

    &&Close[10] <   Close[1]+(Close[20]-Close[1])

    

    && Close[10]<Ask )

   

   

  

  

  

  

   {

      Print("Появился сигнал для открытия позиции Sell");

      if(GetPositionsNumber()==0)

      {

   //      allowOpenBuy=true;

        allowOpenSell=true;

      Sleep(1000);

     

     

         Print("Разрешено открыть позицию Sell");

      }

   }

}
















/////////////////////////////////////////



//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| Функция возвращает количество открытых позиций                                                                                                  |

//+-------------------------------------------------------------------------------------------------------------------------------------------------+







int GetPositionsNumber(void)

{

   int number=0;

   for(int i=0; i<OrdersTotal(); i++)

      if(OrderSelect(i,SELECT_BY_POS))

         if(OrderSymbol()==_Symbol && OrderMagicNumber()==magic)

            number++;

   return number;

}

//+---------------------------------------------------------------------------------------------------------------------------------

 
vvs1:

Помогите, плз, можно ли добавить к этому советнику такую функцию, чтобы советник установленный в окне  EURUSD открывал сделку с такими же параметрами открытия,в то же время, но  по GBPUSD, а по EURUSD  не открывал.

Простите, у вас с головой всё в порядке? Мало того, что код вставил через одно место, да ещё и не удалил закомментированные строки, да ещё и пустые строки оставил в огромном количестве.

Вам не кажется, что надо уважать тех у кого просите помощи???

Причина обращения: