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

 
Artyom Trishkin:

О! Спасибо. Сам не догадался по утру... Правда всё же проверку на заполнение массивов нужно сделать. В четвёрке не встречал, а в пятёрке частенько не заполняются данные с первого раза из-за нехватки исторических данных.

ЗЫ. Надо больше спать - мысли в ту сторону работать будут.

Ну можно и в цикл поставить

do while(CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle) < 0);

или даже

do while(CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle) < 15);

чтобы скопировано было именно то количество какое затребовано.


ps; Пока я ходил налить чайку, появилась ещё такая мысль, использовать CopyRates() и массив структур MqlRates rates[] но переписывать что-то лениво.

 
Alexey Viktorov:

Ну можно и в цикл поставить

do while(CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle) < 0);

или даже

do while(CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle) < 15);

чтобы скопировано было именно то количество какое затребовано.


ps; Пока я ходил налить чайку, появилась ещё такая мысль, использовать CopyRates() и массив структур MqlRates rates[] но переписывать что-то лениво.

А я разве не так предложил?
 
giannis1386:
доброго времени суток. ручки у меня кривые. помогите пожалуйста добавить проверку стоп лосс для селл (slevel). а то он с ценой в догоняшки играеть. 
int start()
{
//+--------------------------------------------------------------------+
//|   -= 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;
}
}
}
}

Логика у вас странная. Но даже если не смотреть на странную логику, то:

Вот здесь у вас для Buy проверяются два условия, а для Sell - всё остальное

if(cmd==OP_BUY && blevel) stop=Bid-Point*TS;
else                      stop=Ask+Point*TS;
 
Artyom Trishkin:

Логика у вас странная. Но даже если не смотреть на странную логику, то:

Вот здесь у вас для Buy проверяются два условия, а для Sell - всё остальное

if(cmd==OP_BUY && blevel) stop=Bid-Point*TS;
else                      stop=Ask+Point*TS;

я вот и пытался для Sell прикрутить slevel=OrderStopLoss()>Ask+Point*TS;

но так как в программировании ни бум бум так ничего толкового и не получилось. неделю ковырял форумы. все попытки заканчивались тем что селовский стоп бегает вместе с ценой. 

 

а почему странная логика?) код не полностью мой. переделал как смог 

 
giannis1386:

я вот и пытался для Sell прикрутить slevel=OrderStopLoss()>Ask+Point*TS;

но так как в программировании ни бум бум так ничего толкового и не получилось. неделю ковырял форумы. все попытки заканчивались тем что селовский стоп бегает вместе с ценой. 

 

а почему странная логика?) код не полностью мой. переделал как смог 

А вы сначала на листочку карандашиком напишите условия, при которых нужно сместить стоп Buy и стоп Sell.

А уже потом, после осмысления написанного, пишите в коде то, что записано на листочке.

 
Artyom Trishkin:

А вы сначала на листочку карандашиком напишите условия, при которых нужно сместить стоп Buy и стоп Sell.

А уже потом, после осмысления написанного, пишите в коде то, что записано на листочке.

slevel=OrderStopLoss()>Ask+Point*TS; ну вот оно вроде как для села. или не правильное? я нубоват в этом деле. 
 
giannis1386:
slevel=OrderStopLoss()>Ask+Point*TS; ну вот оно вроде как для села. или не правильное? я нубоват в этом деле. 

Вы вообще понимаете что записано в этом условии? Это же присвоение нуля или единицы переменной с типом double

Что вы хотите этим получить?

 
Artyom Trishkin:

Вы вообще понимаете что записано в этом условии? Это же присвоение нуля или единицы переменной с типом double

Что вы хотите этим получить?

вот то что вычитал.

условие проверки - чтобы не двигать SL туда-сюда, а только в одну сторону

Например для BUY-ордера ваша формула

OrderStopLoss()<bid-point*TrailingStop

на этом примере склепал для села 

 
giannis1386:

вот то что вычитал.

условие проверки - чтобы не двигать SL туда-сюда, а только в одну сторону

Например для BUY-ордера ваша формула

OrderStopLoss()<bid-point*TrailingStop

на этом примере склепал для села 

Так вам нужно так:

по-русски... если стоп ордера меньше чем цена Bid минус размер дистанции трейлингстоп, то ... ваши действия

А вы присваиваете переменной результат этого логического выражения - т.е., либо ноль, либо единицу.

 
Artyom Trishkin:

Так вам нужно так:

по-русски... если стоп ордера меньше чем цена Bid минус размер дистанции трейлингстоп, то ... ваши действия

А вы присваиваете переменной результат этого логического выражения - т.е., либо ноль, либо единицу.

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

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

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

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

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