[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 304

 
pigvin:

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

я подумал что можно устранить с помощью обычного счетчика баей и селов - если ордер бай открылся счетчик +1, и новый бай нельзя открыть пока счетчик больше 0, обнуляется счетчик только после того как будет сел. но почему то не работает не могу понять почему??? посмотрите логику может я где-то ошибся?? метры mql точно сталкивались с подобной проблемой.

Т.е. на обном баре сигнал есть, но он уже использован?

Можно так

datetime save_time; 
int tf=0;
старт
...
if(total<1)//проверка количества ордеров 
   {
         if(save_time!=iTime(0,tf, iBarShift(0,tf,Time[0])))
            save_time =iTime(0,tf, iBarShift(0,tf,Time[0]));
         else return;


  ...
 if(ticket>0)
                      {
                         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("открыта позиция BUY : ",OrderOpenPrice());
      
                         else Print("Ошибка при открытии BUY позиции : ",GetLastError()); 
                        }else{ save_time =0;}// так как ошибка запретим ретурн (см. выше)
 
Operr:

Попробуйте так

if (OrderOpenTime()+2*1440*60  > Time[0])   //т.е. последнее время текушего графика а не локальное

должно и так и так работать.

Для меня так понятнее.

if (Time[0]-OrderOpenTime() >= 2*1440*60 )   
 

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

Извините за оффтоп, тема востребована, потому и пишу сюда, может подскажете? Зациклился.

Как, используя только элементарные операции (+-*/%), произвести возведение в степень (в т.ч. вещественную) вещественного числа? Например, виндовый калькулятор при возведении 1.2 в степень 1.2 дает результат 1,2445647472039777218169154111826. Интересует алгоритм, язык не имеет значения, любой. Переведу сам.

ЗЫ. Сколько контрольных по программированию не делал, такую задачу вижу впервые, хотя может для кого-то это и тривиально?

 

Всем добрый день!

Обыскал много форумов и статей google ,но ответ так и не нашел

Решил написать советник для торговли на двух противоположных ордерах на М1

Идея проста :выставляются два противоположных ордера с небольшим ТР,далее при срабатывании ТР одного из них для второго включается таймер в виде количества баров(допустим 5)-он и будет по сути временным SL. Рассчет на то,что если валюта будет двигаться в том же направлении-то потери после срабатывания временного SL по второму ордеру будут минимальны,если же график развернется-то мы в плюсе по двум позициям .Так как используется M1 то количество открытых ордеров даже за сутки огромно-на это и ставка.

ПРОБЛЕМА же заключается в том,что я не знаю как написать кусок кода,в котором будет "при срабатывании ТР одного из них для второго включается таймер в виде количества баров"

на данный момент работает только таймер для двух ордеров сразу,но от этого толка нет

PS уже месяц не могу разрешить эту проблему,помогите советом или кодом:)

вот код советника

extern int SL=100;

extern int TP=100;

extern double StartLot=0.1;

extern double StopLot=1.0;

extern int bar_time=20;


double Lot()

{

double lt;

if(OrdersHistoryTotal()==0) return (StartLot);

if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))

{

if(OrderProfit()<0)

{

lt=OrderLots()*2;

if(lt>StopLot) return (StartLot);

else return (lt);

}

else

return (StartLot);

}

else

return (StartLot);

}

int start()

{

double lot;

if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)

{

int order;

{

lot=Lot();

order=OrderSend(Symbol(),OP_BUY,lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Green);

order=OrderSend(Symbol(),OP_SELL,lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,Green);

}

}

//вот здесь должно быть что-то что является решением проблемы и связующим звеном

{

int bars = iBarShift( Symbol(), PERIOD_M1, OrderOpenTime() ) ;

if ( iTime( Symbol(), PERIOD_M1, bars ) > OrderOpenTime() ) { bars ++; }

if ( bars >= bar_time )

OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5,White);

}

return(0);

}


Спасибо заранее

 
не на одном баре! а в принципе в этом тренде уже не надо открываться пока не будет сигналов на разворот или на мудоту рынка!
costy_:

Т.е. на обном баре сигнал есть, но он уже использован?

Можно так

 
snail09:

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

Извините за оффтоп, тема востребована, потому и пишу сюда, может подскажете? Зациклился.

Как, используя только элементарные операции (+-*/%), произвести возведение в степень (в т.ч. вещественную) вещественного числа? Например, виндовый калькулятор при возведении 1.2 в степень 1.2 дает результат 1,2445647472039777218169154111826. Интересует алгоритм, язык не имеет значения, любой. Переведу сам.

ЗЫ. Сколько контрольных по программированию не делал, такую задачу вижу впервые, хотя может для кого-то это и тривиально?

https://docs.mql4.com/ru/math/MathPow не? Или элементарные операции это условие задачи. тогда вариант http://bpascal.ru/download/desc/436.php если уж совсем все на ручнике делать, то реализовать экспоненту и логарифм своими функциями.

 
индикаторcosty_:

Вы используете while(i>=0), значит при появлении новой свечи i=1 (ну чтоб наверняка данные предыдущей свечи рассчиталась по зафиксированным данным один раз).

Зачем вводить some_time=D'1971.01.11 00:00'; используйте Bars, IndicatorCounted не глучит у меня (ну и ошибка наверно из за этого first_t_bar).

Ваш алгоритм и вам его лечить.

"Я в програмировании новичек." с 2007года )).


Все таки не понятно почему моя конструкция работает нормально, а стандартная нет. some_time=D'1971.01.11 00:00'; тут используется один раз при запуске. Потом дата меняется на другую, да это здесь и не причем т.к. в одном случае работает, а в другом нет. Я позже переделаю индикатор. Это измененный вариант другого индикатора. Спасибо за ответ!

 
Sonne:

Всем добрый день!

Обыскал много форумов и статей google ,но ответ так и не нашел

Решил написать советник для торговли на двух противоположных ордерах на М1

Идея проста :выставляются два противоположных ордера с небольшим ТР,далее при срабатывании ТР одного из них для второго включается таймер в виде количества баров(допустим 5)-он и будет по сути временным SL. Рассчет на то,что если валюта будет двигаться в том же направлении-то потери после срабатывания временного SL по второму ордеру будут минимальны,если же график развернется-то мы в плюсе по двум позициям .Так как используется M1 то количество открытых ордеров даже за сутки огромно-на это и ставка.

ПРОБЛЕМА же заключается в том,что я не знаю как написать кусок кода,в котором будет "при срабатывании ТР одного из них для второго включается таймер в виде количества баров"

на данный момент работает только таймер для двух ордеров сразу,но от этого толка нет

PS уже месяц не могу разрешить эту проблему,помогите советом или кодом:)

вот код советника

................................................

Спасибо заранее

1. Если есть закрытая позиция по тейку, ...

1.1 Если её тип OP_BUY, ...

1.1.2 Если есть открытая позиция OP_SELL, ...

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

1.1.4. Закрываем позицию Sell

1.2 Если её тип OP_SELL, ...

1.2.2 Если есть открытая позиция OP_BUY, ...

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

1.2.4. Закрываем позицию Buy

 
Здраствуйте, подскажите пожалуйста где взять нормальную историю(без дыр) и подходит ли минутная история с МТ5 для МТ4?
 

Всем доброго вечера, извиняюсь за ранее за тупой вопрос)

Возможно ли в советнике, в котором есть переменная, допустим "А", ей присваивается значение цены в данный момент и он торгует. Изменить данное значение на любое историческое, допустим взять любое значение месячной давности, и вывести нужные значения по анализу истории . Пробовал делать это на тестере стратегий, но много сомнений по его правильности. Или же придется переделывать и работать с массивами!? Всем спасибо.

p.s. Хочу узнать т.к. в справочнике и учебнике MQL не нашел.

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