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

 
gyfto:

У меня детский вопрос. В шапке кода объявлены переменные. По-идее, они глобальные. Но я не понимаю, чем отличается

от

, если эта переменная объявлена в шапке кода. По-идее, областью видимости переменной. Но она и в том и в другом случае видна внутри функции. Провёл тест (скрипт):

- различий не заметил. Можете ли вы объяснить их разницу, а то я её не понимаю.

Там статик лишний. Без него также будет работать. Имеет смысл статик объявлять внутри функций. Область видимости только блок функции.
 
Zhunko:
Имеет смысл статик объявлять внутри функций. Область видимости только блок функции.


Работает так же:

int a = 10;
int start(){
   Alert(StringConcatenate("st: a = ", a));//st: a = 10
   f1(); Alert(StringConcatenate("f1: a = ", a));//f1: a = 10
   f2(); Alert(StringConcatenate("f2: a = ", a));//f2: a = 10
}
void f1(){
   int a = 11;
   return;
}
void f2(){
   static int a = 12;
   return;
}

В каком случае разница будет ощущаться? ALXIMIKS, тоже благодарю за ответ.

 

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

Скажите, как установить дополнительный индикатор/робот на mt4, установленный на iphone/ipad? Это, в принципе, возможно? С Windows всё элементарно просто, а вот с мобильной продукцией компании Apple - не всё так очевидно.

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

Заранее спасибо.

 

Делаю индикатор на основе скользящих средних. Идея в том, чтобы отсечь незначительные движения в пределах заданных пунктов. Допустим, задаем фильтр в 50 пунктов. Индикатор снижается, но снижение меньше 50 пунктов, значит, берем значение средней вчера и записываем, устанавливаем ее уровень на текущую дату. На следующем баре проверяем разницу, текущее значение минус то значение, что записали, если итог не более 50 пунктов, ставим в текущее значение, тот уровень, что хранится в статической переменной. При превышении значения значение становится текущим, то есть аналогично скользящей средней со сдвигом ноль. Перепробовал различные вариации, но пока не нашел правильного решения.

Для простоты восприятия прикладываю код для отрисовки только снижения. Проблема в том, что индикатор рисует на росте. И основная, что при запуске в тестере визуально вижу изменения индикатора, притом, что нет выхода за пределы фильтра. Предполагаю, что где-то значение записанного значения «MA_otshet» теряется.

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red 
//--- input parameters
//--- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,0,1);
   SetIndexBuffer(0,ExtMapBuffer1);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),                      
    limit;
    double
    raznica,raznica_static,MA_0_t,MA_1_t;
   static double MA_otshet;  //здесь хранится запись значения MA_otshet
   
   for(int i=0;i<Bars;i++)
   {  
      MA_0_t=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,i+0);  
      MA_1_t=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,i+1); 
      raznica=MA_0_t-MA_1_t; //разница между сегодня и вчера по скользящей средней
      raznica_static=MA_0_t-MA_otshet; //разница между сегодня и MA_otshet

      if(raznica > -0.005 && raznica <= 0) // если raznica не превышает заданное число 
          {
          MA_otshet=MA_1_t; // записываем значение MA_otshet
          }
      if(raznica_static > - 0.005 && raznica_static <= 0) //если raznica_static не превышает заданное число
          {
          ExtMapBuffer1[i]=MA_otshet;  // то рисуем значение индикатора, как записанный MA_otshet
          }
      if(raznica_static < - 0.005) // если raznica превышает заданное число
          {
          ExtMapBuffer1[i]=MA_0_t; // то рисуем значение по текущей цене
          }
   } 
   return(0);
  }
//+------------------------------------------------------------------+
 

добрый день. помогите пожалуйста.

нужно чтобы в 23 55 закрывались все ордера а в пятницу торговля заканчивается в 22 00 поэтому идет косяк с торговлей

я нашел в учебнике скрипт в разделе время помогите пожалуста допишите параметр номер дня тоесть чтобы в пятницу закрывались ордера в 21 55 а в обычные дни в 23 55 или же может поделитесь ссылкое если есть готовые решения

//--------------------------------------------------------------------
// timeevents.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
extern double Time_Cls=16.10;          // Время закрытия ордеров
bool Flag_Time=false;                  // Флаг, сообщения ещё не было 
//--------------------------------------------------------------- 2 --
int start()                            // Спец. функция start
  {
   int    Cur_Hour=Hour();             // Серверное время в часах
   double Cur_Min =Minute();           // Серверное время в минутах
   double Cur_time=Cur_Hour + Cur_Min100; // Текущее время
   Alert(Cur_time);
   if (Cur_time>=Time_Cls)             // Если наступило время события
      Executor();                      //.. то выполняем задуманное
   return;                             // Выход из start()
  }
//--------------------------------------------------------------- 3 --
int Executor()                         // Пользовательская функция
  {
   if (Flag_Time==false)               // Если ещё не было сообщения..
     {                                 // .. то сообщаем (1 раз)
      Alert("Время важных новостей. Закройте ордера.");
      Flag_Time=true;                  // Теперь сообщение уже было
     }
   return;                             // Выход из польз. функции
  }

//--------------------------------------------------------------- 4 --

 
r772ra:
Легко!!!


Спс. А вот не подскажите. Мне нужно всего за 1 день. То есть вывести информацию о прибыли за последний рабочий день

Переменные объявлены. Не получается. Все по нулям.

for (p=0; p<OrdersHistoryTotal(); p++) {

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {

if (StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))<OrderCloseTime() && (OrderType()==OP_BUY || OrderType()==OP_SELL) )

p0+=OrderProfit()+OrderCommission()+OrderSwap();

}

}

double r0=p0*100/AccountBalance();

 
Zolotai:


Спс. А вот не подскажите. Мне нужно всего за 1 день. То есть вывести информацию о прибыли за последний рабочий день

Переменные объявлены. Не получается. Все по нулям.

for (p=0; p<OrdersHistoryTotal(); p++) {

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {

if (StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))<OrderCloseTime() && (OrderType()==OP_BUY || OrderType()==OP_SELL) )

p0+=OrderProfit()+OrderCommission()+OrderSwap();

}

}

double r0=p0*100/AccountBalance();


В этом советнике есть библиотека MM_Light, а в ней функция:

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Считаем итоги работы по своим ордерам                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fCalculate_Pribul (int fi_OP = -2,              // тип (BUY\SELL) учитываемых ордеров
                          datetime fdt_TimeBegin = 0,  // момент времени, с которого производим расчёт
                          string fs_Comment = "")      // комментарий ордеров
{
    double   ld_Pribul = 0.0;
    int      history_total = OrdersHistoryTotal();
//----
    for (int li_ORD = 0; li_ORD < history_total; li_ORD++)
    {
        if (!fCheck_MyOrders (li_ORD, fi_OP, MODE_HISTORY)) continue;
        if (fdt_TimeBegin > OrderCloseTime()) continue;
        if (fs_Comment != "") {if (StringFind (OrderComment(), fs_Comment) < 0) continue;}
        ld_Pribul += (OrderProfit() + OrderSwap() + OrderCommission());
    }
//----
    return (ld_Pribul);
}
Принцип понять не сложно. Для того, чтобы подсчитать прибыль\убыток за текущие сутки нужно передать ей значение: fCalculate_Pribul (-2, iTime (Symbol(), PERIOD_D1, 0), "").
 
sannin:

добрый день. помогите пожалуйста.

нужно чтобы в 23 55 закрывались все ордера а в пятницу торговля заканчивается в 22 00 поэтому идет косяк с торговлей

я нашел в учебнике скрипт в разделе время помогите пожалуста допишите параметр номер дня тоесть чтобы в пятницу закрывались ордера в 21 55 а в обычные дни в 23 55 или же может поделитесь ссылкое если есть готовые решения

//--------------------------------------------------------------- 4 --

Навскидку так, код конечно на коленке написанный, но работать должен, по крайней мере Вам разобраться

int start() {
switch(DayOfWeek()){// если пятница,суббота, и т.д.
 case 4://пятница
 case 5://суббота на всякий случай
 case 6://воскресенье на всякий случай
             if((Hour()==22 && Minute()>=00) || Hour()>22){
                 //   Выполняем какое то действие  в пятницу после 22:00
             }
             break;
 case 0://понедельник
 case 1://вторник
 case 2://среда
 case 3://четверг
             if(Hour()>23 || (Hour()==23 && Minute()>55)){
                // все остальные действия в нормальные рабочии дни ПОСЛЕ 23:55
             }
              break;
  default:   {//все остальные действия в нормальные рабочии дни до 23:55
  
             }
 }                   
}
 
SetIndexStyle(1,DRAW_LINE,STYLE_DASH,0);
Где в этой части указывается толщина линии? Мне даже стыдно стало. :(
 
Link_x:
Где в этой части указывается толщина линии? Мне даже стыдно стало. :(
Последний параметр.