Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 21
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Здесь единственное нужно учесть, чтол после блока цикла i==x
при этом Array[i] после for(...){} вернет ошибку выхода за границы массива и всё
Подскажите, а то начал лагать)
Есть такая конструкция:
HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));
Она находит High/Low диапазона за N свечей.
Вопрос: как найти тот-же High/Low, но не по теням, а по телам, картинку прилагаю:
Подскажите, а то начал лагать)
Есть такая конструкция:
HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));
Она находит High/Low диапазона за N свечей.
Вопрос: как найти тот-же High/Low, но не по теням, а по телам, картинку прилагаю:
Нужно искать для верха свечи fmax(Open[i],Close[i]), а для низа свечи fmin(Open[i],Close[i])
То есть, делать перебор в цикле вместо двух строк, которые ищут High/Low?
HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));Это нужно для советника, а не индикатора, в советнике это работает правильно, но как найти диапазон по телам - не могу придумать.
То есть, делать перебор в цикле вместо двух строк, которые ищут High/Low?
HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));Это нужно для советника, а не индикатора, в советнике это работает правильно, но как найти диапазон по телам - не могу придумать.
Накидал скрипт проверочный. Могут быть неточности - "на коленке" писал. Надеюсь, разберётесь.
//| 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)>0) {
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);
}
//+------------------------------------------------------------------+
Накидал скрипт проверочный. Могут быть неточности - "на коленке" писал. Надеюсь, разберётесь.
//| sFindRangeByCandlesBody.mq4 |
//| Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//| https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+
Спасибо, работает отменно!
PS. Я так понимаю, что эта штука будет работать в пятом?
Спасибо, работает отменно!
PS. Я так понимаю, что эта штука будет работать в пятом?
{
//+--------------------------------------------------------------------+
//| -= stop loss в без убыток =- |
//+--------------------------------------------------------------------+
bool result;
double stop;
int cmd,error;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderProfit()>pOPCS)
{
cmd=OrderType();
double blevel=OrderStopLoss()<Bid-Point*TS;
double slevel=OrderStopLoss()>Ask+Point*TS;
//---
if(cmd==OP_BUY || cmd==OP_SELL)
{
while(true)
{
if(cmd==OP_BUY && blevel) stop=Bid-Point*TS;
else stop=Ask+Point*TS;
result=OrderModify(OrderTicket(),OrderOpenPrice(),stop,0,0,Orange);
if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
else error=0;
if(error==135) RefreshRates();
else break;
}
}
}
}
Накидал скрипт проверочный. Могут быть неточности - "на коленке" писал. Надеюсь, разберётесь.
Ежли что - вопрошайте...
Артём извини, но я хочу чуток попроще показать решение этой проблемы
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)]);
Надеюсь оформить это в своём коде и добавить необходимые проверки сможет каждый. Работоспособность одинаковая как в mql4 так и в mql5.
Артём извини, но я хочу чуток попроще показать решение этой проблемы
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)]);
Надеюсь оформить это в своём коде и добавить необходимые проверки сможет каждый. Работоспособность одинаковая как в mql4 так и в mql5.
О! Спасибо. Сам не догадался по утру... Правда всё же проверку на заполнение массивов нужно сделать. В четвёрке не встречал, а в пятёрке частенько не заполняются данные с первого раза из-за нехватки исторических данных.
ЗЫ. Надо больше спать - мысли в ту сторону работать будут.