Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 287

 
artmedia70:

Нужно в код добавить в данной ситуации. Создаёте внешнюю переменную, например Appled_Price.

И в коде все PRICE_CLOSE меняете на Appled_Price.


Ах, да, прошу прощения, я про новые билды, а там код немного непривычный.

В том-то и дело, нету в коде цены в свободном виде, всё на массивах, тупо заменить не получится, пробовал (((

Да и если бы полчилось, как сделать выбор из выпадающего списка (как на картинке из моего вопроса)?


//+------------------------------------------------------------------+
//|                                       Custom Moving Averages.mq4 |
//|                   Copyright 2005-2013, MetaQuotes Software Corp. |
//|                                              https://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2013, MetaQuotes Software Corp."
#property link        "https://www.mql4.com"
#property description "Moving Average"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//--- indicator parameters
input int            InpMAPeriod=13;        // Period
input int            InpMAShift=0;          // Shift
input ENUM_MA_METHOD InpMAMethod=MODE_SMA;  // Method
//--- indicator buffer
double ExtLineBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   string short_name;
   int    draw_begin=InpMAPeriod-1;
//--- indicator short name
   switch(InpMAMethod)
     {
      case MODE_SMA  : short_name="SMA(";                break;
      case MODE_EMA  : short_name="EMA(";  draw_begin=0; break;
      case MODE_SMMA : short_name="SMMA(";               break;
      case MODE_LWMA : short_name="LWMA(";               break;
      default :        return(INIT_FAILED);
     }
   IndicatorShortName(short_name+string(InpMAPeriod)+")");
   IndicatorDigits(Digits);
//--- check for input
   if(InpMAPeriod<2)
      return(INIT_FAILED);
//--- drawing settings
   SetIndexStyle(0,DRAW_LINE);
   SetIndexShift(0,InpMAShift);
   SetIndexDrawBegin(0,draw_begin);
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtLineBuffer);
//--- initialization done
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|  Moving Average                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- check for bars count
   if(rates_total<InpMAPeriod-1 || InpMAPeriod<2)
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtLineBuffer,false);
   ArraySetAsSeries(close,false);
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
      ArrayInitialize(ExtLineBuffer,0);
//--- calculation
   switch(InpMAMethod)
     {
      case MODE_EMA:  CalculateEMA(rates_total,prev_calculated,close);        break;
      case MODE_LWMA: CalculateLWMA(rates_total,prev_calculated,close);       break;
      case MODE_SMMA: CalculateSmoothedMA(rates_total,prev_calculated,close); break;
      case MODE_SMA:  CalculateSimpleMA(rates_total,prev_calculated,close);   break;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|   simple moving average                                          |
//+------------------------------------------------------------------+
void CalculateSimpleMA(int rates_total,int prev_calculated,const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
   
     {
      limit=InpMAPeriod;
      //--- calculate first visible value
      double firstValue=0;
      for(i=0; i<limit; i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total && !IsStopped(); i++)
      ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
//---
  }
//+------------------------------------------------------------------+
//|  exponential moving average                                      |
//+------------------------------------------------------------------+
void CalculateEMA(int rates_total,int prev_calculated,const double &price[])
  {
   int    i,limit;
   double SmoothFactor=2.0/(1.0+InpMAPeriod);
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      limit=InpMAPeriod;
      ExtLineBuffer[0]=price[0];
      for(i=1; i<limit; i++)
         ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor);
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total && !IsStopped(); i++)
      ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor);
//---
  }
//+------------------------------------------------------------------+
//|  linear weighted moving average                                  |
//+------------------------------------------------------------------+
void CalculateLWMA(int rates_total,int prev_calculated,const double &price[])
  {
   int        i,limit;
   static int weightsum;
   double     sum;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      weightsum=0;
      limit=InpMAPeriod;
      //--- calculate first visible value
      double firstValue=0;
      for(i=0;i<limit;i++)
        {
         int k=i-1;
         weightsum+=k;
         firstValue+=k*price[i];
        }
      firstValue/=(double)weightsum;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total && !IsStopped(); i++)
     {
      sum=0;
      for(int j=0;j<InpMAPeriod;j++)
         sum+=(InpMAPeriod-j)*price[i-j];
      ExtLineBuffer[i]=sum/weightsum;
     }
//---
  }
//+------------------------------------------------------------------+
//|  smoothed moving average                                         |
//+------------------------------------------------------------------+
void CalculateSmoothedMA(int rates_total,int prev_calculated,const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      limit=InpMAPeriod;
      double firstValue=0;
      for(i=0; i<limit; i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total && !IsStopped(); i++)
      ExtLineBuffer[i]=(ExtLineBuffer[i-1]*(InpMAPeriod-1)+price[i])/InpMAPeriod;
//---
  }
//+------------------------------------------------------------------+
 
evillive:

В том-то и дело, нету в коде цены в свободном виде, тупо заменить не получится (((

Попробуйте тут

switch(InpMAMethod)
     {
      case MODE_EMA:  CalculateEMA(rates_total,prev_calculated,close);        break;
      case MODE_LWMA: CalculateLWMA(rates_total,prev_calculated,close);       break;
      case MODE_SMMA: CalculateSmoothedMA(rates_total,prev_calculated,close); break;
      case MODE_SMA:  CalculateSimpleMA(rates_total,prev_calculated,close);   break;
     }

поменять close на open. Если начнёт по Open считать, то копайте в эту сторону как сделать смену этого значения. Я сейчас не могу бета-версию терминала запустить, чтобы поглядеть в его редакторе.

Предварительно ещё тут замените:

//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtLineBuffer,false);
   ArraySetAsSeries(close,false);
//--- first calculation or number of bars was changed
 
Нет смысла менять Close на Open, будут незначительные изменения. Проще не заморачиваться такой ерундой, да брать данные со сформированного бара.
 

приветствую всех))

написал советника, но он ваще не работает)))) или неправильно работает. сколько уже ковыряюсь, исправляю многое, но, тем не менее, советник не работает.

вот фрагмент расчета торговых решений по индикатору RSI :

//--------------------Данные------------------------------------

   int Ticket1_RSI=-1, Ticket2_RSI=-1;                    // Номера открытых ордеров
   extern double Lot=0.01;                                 // Объем лота
int RSI()                                                  // Функция RSI
   {                                                                                                             
   double T, P;
   double RSI_0, RSI_1, RSI_2;                      // Значения индикатора RSI
//------------------Значения индикатора---------------------------------------   
   RSI_0=iRSI(Symbol(), 0, 14, PRICE_CLOSE, 0);              // Получаем данные от RSI 
   RSI_1=iRSI(Symbol(), 0, 14, PRICE_CLOSE, 1);              // Получаем данные от RSI 
   RSI_2=iRSI(Symbol(), 0, 14, PRICE_CLOSE, 2);              // Получаем данные от RSI 
//------------------Условие на продажу---------------------------------   
   if (RSI_1 > RSI_0 > 70 && RSI_1 > RSI_2)         // Если индикатор превышает значение 70 и виден поворот вниз
      {                                                                                                           
      if (Ticket2_RSI > 0)                                                     // Если имеется ордер на покупку
         OrderClose(Ticket2_RSI, OrderLots(), Bid, 0, 0);                            // Закрытие ордера на покупку
      if (Ticket1_RSI <= 0)                                                    // Если ордера на продажу нет
         {
         Ticket1_RSI=OrderSend(Symbol(), OP_SELL, Lot, Bid, 2, 0, 0);        // Открытие ордера на продажу
         if (OrderSelect(Ticket1_RSI, SELECT_BY_TICKET)==true)
            {
            T=OrderOpenTime();
            P=OrderOpenPrice();
            ObjectCreate("Arrow", 22, 0, T, P);               // Создание индикатора ордера
            ObjectSet("Arrow", OBJPROP_COLOR, IndianRed);                             // Изменение цвета в мутно-красноватый
            ObjectSet("Arrow", OBJPROP_ARROWCODE, 242);                               // Направление стрелки вниз
            ObjectCreate("Text", 21, 0, T, P);                // Создание текстового объекта
            ObjectSetText("Text", "Open sell-order by RSI", 6, "Times New Roman", Navy);     // Текст, шрифт, стиль, цвет     
            }
         }
      }
//-------------------Условие на покупку--------------------------------   
   if (RSI_1 < RSI_0 < 30 &&  RSI_1 < RSI_2)         // Если индикатор ниже значения 30 и виден поворот вверх
      {
      if (Ticket1_RSI > 0)                                                     // Если имеется ордер на продажу
         OrderClose(Ticket1_RSI, OrderLots(), Ask, 0, 0);                            // Закрытие ордера на продажу
      if (Ticket2_RSI <= 0)                                                    // Если ордера на продажу нет
         {
         Ticket2_RSI=OrderSend(Symbol(), OP_BUY, Lot, Ask, 2, 0, 0);         // Открытие ордера на покупку
         if (OrderSelect(Ticket2_RSI, SELECT_BY_TICKET)==true)
            {
            T=OrderOpenTime();
            P=OrderOpenPrice();
            ObjectCreate("Arrow", 22, 0, T, P);   // Создание индикатора ордера          
            ObjectSet("Arrow", OBJPROP_COLOR, LawnGreen);                             // Изменение цвета в ярко-зеленый
            ObjectSet("Arrow", OBJPROP_ARROWCODE, 241);                               // Направление стрелки вверх
            ObjectCreate("Text", 21, 0, T, P);     // Создание текстового объекта
            ObjectSetText("Text", "Open buy-order by RSI", 6, "Times New Roman", Navy);      // Текст, шрифт, стиль, цвет
            }
         }   
      }
//--------------------------------------------------------------------   
   return;    
   } 

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

помогите разобраться)) просто сам новичок в этом

 
waroder:

приветствую всех))

написал советника, но он ваще не работает)))) или неправильно работает. сколько уже ковыряюсь, исправляю многое, но, тем не менее, советник не работает.

вот фрагмент расчета торговых решений по индикатору RSI :

//--------------------Данные------------------------------------

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

помогите разобраться)) просто сам новичок в этом


if (RSI_1 > RSI_0 && RSI_0 > 70 && RSI_1 > RSI_2)         // Если индикатор превышает значение 70 и виден поворот вниз
 
Vinin:



то есть в условиях надо отдельно писать каждое неравенство? если как то обобщать, то будет восприниматься как ошибка? тогда почему при компиляции программа говорит, что ошибок нет?
 
waroder:

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

Ошибки и нету, просто Вы получаете не тот результат, который ждете.
 
hoz:

...Как искать в такой ситуации причину?


Чисто случайно наткнулся. Упрощать надо. Закомментировать все, раскоментировать первый импорт, откомпилировать, повызывать функции, и т.д.


 
Integer:
Нет смысла менять Close на Open, будут незначительные изменения. Проще не заморачиваться такой ерундой, да брать данные со сформированного бара.
Согласен, но раз был вопрос...
 
Vinin:

Ошибки и нету, просто Вы получаете не тот результат, который ждете.


все)) тут я немного разобрался) один ордер сразу открывался без дальнейших изменений, потому что в строке:

   RSI_1=iRSI(Symbol(), 0, 14, PRICE_CLOSE, 1);              // Получаем данные от RSI 

необходимо прописывать NULL вместо Symbol(), так как идет несоответствие в типах переменных. из-за этого у меня RSI как с нулевым значением воспринимался, вот сразу и открывал, потому что условие работало. а в дальнейшем RSI так и был нулевым, и ордер оставался без изменений.

сейчас исправил, все нормально работает.

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

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