Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 23
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
я окончательно запутался.
double blevel=OrderStopLoss()<Bid-Point*TS; у меня работает. SL идет за ценой только в прибыль.
double slevel=OrderStopLoss()>Ask+Point*TS; а вот эту вот я не знаю как добавить в else
они у меня не bool вроде.
Не bool, но это называется неявное преобразование
Что вы вообще делаете? Трал?
Не bool, но это называется неявное преобразование
Что вы вообще делаете? Трал?
да пытался сделать трал. оригинал скрипа был просто на закрытие при достижении профита по ордеру
да пытался сделать трал. оригинал скрипа был просто на закрытие при достижении профита по ордеру
Логика:
Если профит текущего выбранного в цикле ордера больше заданного, то если его стоплосс меньше (для Buy)/больше (для Sell) рассчитанного уровня стоплосс трала, то сместить стоп на новое значение.
Это если сильно вкратце.
А я разве не так предложил?
Ага... Я твой код так невнимательно посмотрел, что лучше сказать вообще не смотрел. Но это пол. беды, потом я сморозил такую чушь за которую мне даже, почти, стыдно. Почему-то мне вдруг пришла такая бредовая мысль, что ArrayMaximum() можно применить к массиву структур или даже к отдельному полю этого массива.
Каюсь, никому больше не советую так думать, это не работает...:)
Ага... Я твой код так невнимательно посмотрел, что лучше сказать вообще не смотрел. Но это пол. беды, потом я сморозил такую чушь за которую мне даже, почти, стыдно. Почему-то мне вдруг пришла такая бредовая мысль, что ArrayMaximum() можно применить к массиву структур или даже к отдельному полю этого массива.
Каюсь, никому больше не советую так думать, это не работает...:)
Ну дык... А я? Точно так же проглядел твой код, что раскланялся в благодарностях - мол действительно короче...
Короче - оба стоим анекдота...
Не скрипта - советника. Путаете виды программ. Скрипт выполняется один раз после загрузки на график, а потом удаляется. Если он не зацикленный. Вряд ли кто-то будет делать зацикленный скрипт для закрытия позиций.
со слов автора:
Вот немного измененный стандартный скрипт MT4 close.mq4Поместите файл в папку MetaTrader\experts\Scripts,
Ну дык... А я? Точно так же проглядел твой код, что раскланялся в благодарностях - мол действительно короче...
Короче - оба стоим анекдота...
Неее, я не согласен. Этот код
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() заполняет массив структур и поэтому нельзя выбрать максимум и минимум воспользовавшись функциями работы с массивами.
со слов автора:
Вот немного измененный стандартный скрипт MT4 close.mq4Поместите файл в папку MetaTrader\experts\Scripts,
Значит его скрипт работает одноразово - накинул на график - скрипт отработал (закрыл позиции) и выгрузился.
А вам не скрипт нужен, а советник.
Неее, я не согласен. Этот код
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);
}
//+------------------------------------------------------------------+