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

 
giannis1386:

я окончательно запутался.

double blevel=OrderStopLoss()<Bid-Point*TS; у меня работает. SL идет за ценой только в прибыль.

double slevel=OrderStopLoss()>Ask+Point*TS; а вот эту вот я не знаю как добавить в else

 они у меня не bool вроде.

Не bool, но это называется неявное преобразование

Что вы вообще делаете? Трал?

 
Artyom Trishkin:

Не bool, но это называется неявное преобразование

Что вы вообще делаете? Трал?

да пытался сделать трал. оригинал скрипа был просто на закрытие при достижении профита по ордеру
 
giannis1386:
да пытался сделать трал. оригинал скрипа был просто на закрытие при достижении профита по ордеру
Не скрипта - советника. Путаете виды программ. Скрипт выполняется один раз после загрузки на график, а потом удаляется. Если он не зацикленный. Вряд ли кто-то будет делать зацикленный скрипт для закрытия позиций.
 
giannis1386:
да пытался сделать трал. оригинал скрипа был просто на закрытие при достижении профита по ордеру

Логика:

Если профит текущего выбранного в цикле ордера больше заданного, то если его стоплосс меньше (для Buy)/больше (для Sell) рассчитанного уровня стоплосс трала, то сместить стоп на новое значение.

Это если сильно вкратце.

 
Artyom Trishkin:
А я разве не так предложил?

Ага... Я твой код так невнимательно посмотрел, что лучше сказать вообще не смотрел. Но это пол. беды, потом я сморозил такую чушь за которую мне даже, почти, стыдно. Почему-то мне вдруг пришла такая бредовая мысль, что ArrayMaximum() можно применить к массиву структур или даже к отдельному полю этого массива.

Каюсь, никому больше не советую так думать, это не работает...:)

 
Alexey Viktorov:

Ага... Я твой код так невнимательно посмотрел, что лучше сказать вообще не смотрел. Но это пол. беды, потом я сморозил такую чушь за которую мне даже, почти, стыдно. Почему-то мне вдруг пришла такая бредовая мысль, что ArrayMaximum() можно применить к массиву структур или даже к отдельному полю этого массива.

Каюсь, никому больше не советую так думать, это не работает...:)

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

Короче - оба стоим анекдота...

 
Artyom Trishkin:
Не скрипта - советника. Путаете виды программ. Скрипт выполняется один раз после загрузки на график, а потом удаляется. Если он не зацикленный. Вряд ли кто-то будет делать зацикленный скрипт для закрытия позиций.

со слов автора:

Вот немного измененный стандартный скрипт MT4 close.mq4

Поместите файл в папку MetaTrader\experts\Scripts, 

 
Artyom Trishkin:

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

Короче - оба стоим анекдота...

Неее, я не согласен. Этот код

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

проверен и работает. Здесь простые пользовательские double массивы, а CopyRates() заполняет массив структур и поэтому нельзя выбрать максимум и минимум воспользовавшись функциями работы с массивами.

 
giannis1386:

со слов автора:

Вот немного измененный стандартный скрипт MT4 close.mq4

Поместите файл в папку MetaTrader\experts\Scripts, 

Значит его скрипт работает одноразово - накинул на график - скрипт отработал (закрыл позиции) и выгрузился.

А вам не скрипт нужен, а советник.

 
Alexey Viktorov:

Неее, я не согласен. Этот код

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

проверен и работает. Здесь простые пользовательские double массивы, а CopyRates() заполняет массив структур и поэтому нельзя выбрать максимум и минимум воспользовавшись функциями работы с массивами.

Ну я ж говорю - я тоже супервнимательно глядел твой код. Значит - анекдот про меня

ЗЫ. Правда мой код возвращает четыре значения: High/Low/Highest/Lowest, а твой только High и Low, и мой проверяет успешность копирования данных (правда не всех), а твой нет...

Вот так мой код проверяет полное копирование нужных данных:

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int      Begin=1;       // Бар начала диапазона поиска
input int      RangeBars=20;  // Диапазон поиска
//---
int bars=Bars(Symbol(),PERIOD_CURRENT);
int begin=(Begin<0?0:Begin>bars-3?bars-3:Begin);
int rangeBars=(RangeBars<2?2:
               RangeBars>bars-begin?bars-begin:
               RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates array[];
   double   high=0, low=0;
   int      highest=-1, lowest=-1;
   if(CopyRates(Symbol(),PERIOD_CURRENT,begin,rangeBars,array)==rangeBars) {
      ArraySetAsSeries(array,true);
      high=GetHighestValue(begin,array,highest);
      low=GetLowestValue(begin,array,lowest);
      }
   Print("High=",DoubleToString(high,Digits()),", Highest=",highest,", Low=",DoubleToString(low,Digits()),", Lowest=",lowest);
  }
//+------------------------------------------------------------------+
double GetHighestValue(int bar_begin, MqlRates &array[], int &bar_highest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   high=DBL_MIN;
   bar_highest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmax(array[i].open,array[i].close);
      if(value>high) {
         high=value;
         bar_highest=bar_begin+i;
         }
      }
   return(high);
}
//+------------------------------------------------------------------+
double GetLowestValue(int bar_begin, MqlRates &array[], int &bar_lowest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   low=DBL_MAX;
   bar_lowest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmin(array[i].open,array[i].close);
      if(value<low) {
         low=value;
         bar_lowest=bar_begin+i;
         }
      }
   return(low);
}
//+------------------------------------------------------------------+
Причина обращения: