Во-первых, нужен RefreshRates() перед каждой попыткой и нормализация ТП. Во-вторых, нужно анализировать возникшие ошибки.
А в-третьих, так решать задачу нельзя. Советник должен анализировать кол-во уже открытых позиций и останавливаться, когда их станет достаточно.
Выполнять это все из OnInit тоже неправильно - он может быть вызван в выходные или в не торговое время.
Во-первых, нужен RefreshRates() перед каждой попыткой и нормализация ТП. Во-вторых, нужно анализировать возникшие ошибки.
А в-третьих, так решать задачу нельзя. Советник должен анализировать кол-во уже открытых позиций и останавливаться, когда их станет достаточно.
Выполнять это все из OnInit тоже неправильно - он может быть вызван в выходные или в не торговое время.
Придется Вам, Андрей, повторять второе и третье, а то топикстартер прочитал только "во-первых" )))
Придется Вам, Андрей, повторять второе и третье, а то топикстартер прочитал только "во-первых" )))
Даже не знаю, что на меня нашло )
Т.к. "во-первых" полностью удовлетворило мои потребности.
Тогда до следующих встреч на форуме )

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день, такая ситуация: советник при старте должен открывать несколько позиций в одном направлении и завершать свою работу. Пишу его таким образом:
//--- input parameters
input int profit=25; //Через столько пунктов ставим тейк профит
input bool BUY_or_sale=false; //Ордера на BUY или на SELL
input int number=7; //Сколько штук открывать
input double lotvolume=0.01; //Объем каждого ордера
bool work=true; //Почему-то событие OnInit() происходит многократно если оставить советник включенным долгое время, поэтому ставим это условие
int result=0; //Результат исполнения OrderSend
int i=0; //Для цикла
//-------\/--инициализация советника--\/--------
int OnInit()
{
if (work==true){
//---------------------------------------------------------
for (int j=0; j<number; j++)
{
SendOrder(); //Вызываем функцию столько раз сколько нужно открыть ордеров
}
//---------------------------------------------------------
work=false;
}
return(INIT_SUCCEEDED);
}
//-------/\--инициализация советника--/\--------
//-------\/--функция открытия одного ордера--\/--------
uint SendOrder()
{
result=0; //---обнуляем результат функции OrderSend
//---открываем ордер на BUY или на SELL
if (BUY_or_sale==true) {
result=OrderSend(Symbol(),OP_BUY,lotvolume,Ask,100,0,Bid+profit*0.0001);
}else{
result=OrderSend(Symbol(),OP_SELL,lotvolume,Bid,100,0,Ask-profit*0.0001);
}
Print(result);
//---Если вдруг ордер не открыт, вытаемся его открыть снова аж 10 раз!
if (result==-1) {
Print("НЕ ОТКРЫТ С ПЕРВОГО РАЗА!!");
for(i=1; i<=10; i++) // Пытаемся открыть ордер аж 10 раз с интервалом в секунду
{
Sleep(1000);
if (BUY_or_sale==true) {
result=OrderSend(Symbol(),OP_BUY,lotvolume,Ask,100,0,Bid+profit*0.0001);
}else{
result=OrderSend(Symbol(),OP_SELL,lotvolume,Bid,100,0,Ask-profit*0.0001);
}
Print("Попытка открыть №",i," result=",result);
if (result!=-1) {break;} // Если всё-таки открылся, выходим из цикла
}
}
}
//-------/\--функция открытия одного ордера--/\--------
Да, на всякий случай указал Slippage аж 100, чтоб открывал позицию при огромном изменении цены.
А ннет! Если ордер не открылся с первого раза, то очень редко открывается с последующих разов, хотя вручную открыть его можно. Не пойму почему.
Как заставить эксперт насильно открывать заданное количество ордеров???