При тестировании экспертов: Exp_TEMA.mq5,из статьи: "Создание эксперта, торгующего на разных инструментах" , выражения Told[] Tnew[1]получают следующие значения: Told[] Expression could not be evaluated Tnew[1] Invalid array range.
и My_First_EA.mq5, из статьи: "Пошаговое руководство по написанию MQL5-советников для начинающих", выражение New_Time[1] получает значение:Invalid array range
Что обозначают значения Expression could not be evaluated,Invalid array range, и как они влияют на результаты работы экспертов?
Tnew[1] - выходит за пределы массива, массив описан как Tnew[1], поэтому к его элементам можно обращаться только как к Tnew[0], так как индекс начинается с нуля.
Tnew[1] - выходит за пределы массива, массив описан как Tnew[1], поэтому к его элементам можно обращаться только как к Tnew[0], так как индекс начинается с нуля.
На счет Tnew я уже говорил в другой ветке форума, видимо нужен был комментарий разработчиков :)
Подскажите пожалуйста как открывать только одну сделку по условию. С моим кодом терминал открывает несколько сделок по данному условию, а нужно только одну.
if(Buy_Signal) { mrequest.price = NormalizeDouble(latest_price.ask,_Digits); // последняя цена ask mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit mrequest.type = ORDER_TYPE_BUY; // ордер на покупку //--- отсылаем ордер OrderSend(mrequest,mresult); }
if(Sell_Signal) { mrequest.price = NormalizeDouble(latest_price.bid,_Digits); // последняя цена Bid mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit mrequest.type= ORDER_TYPE_SELL; // ордер на продажу //--- отсылаем ордер OrderSend(mrequest,mresult); }
В результате получается такая картинка:
Как проверить совершалась ли сделка с данными условиями или нет? Пробовал так не идет:
// в этом цикле поочередно перебираем все открытые позиции for(i=0;i<PositionsTotal();i++) { // выбираем позиции только по "нашему" инструменту if(Symbol()==PositionGetSymbol(i)) ... }
Подскажите пожалуйста как открывать только одну сделку по условию. С моим кодом терминал открывает несколько сделок по данному условию, а нужно только одну.
В результате получается такая картинка:
Как проверить совершалась ли сделка с данными условиями или нет? Пробовал так не идет:
А нафига устраивать перебор в цикле если есть такая замечательная вещица как PositionSelect?
Просто проверяем наличие позиции по интересующему нас инструменту и если возвращается true идем спокойно пить коньяк и курить сигары... :)
PS
При этом как я понимаюPositionGetString без PositionSelect работать не должна. Нам ведь не нужно узнать символы всех открытых поз, верно?
А нафига устраивать перебор в цикле если есть такая замечательная вещица как PositionSelect?
Просто проверяем наличие позиции по интересующему нас инструменту и если возвращается true идем спокойно пить коньяк и курить сигары... :)
PS
При этом как я понимаюPositionGetString без PositionSelect работать не должна. Нам ведь не нужно узнать символы всех открытых поз, верно?
Такой код учитывает наличие открытой позиции:
if(Buy_Signal && PositionSelect(Symbol())==false) { mrequest.type = ORDER_TYPE_BUY; // ордер на покупку mrequest.price = NormalizeDouble(latest_price.ask,_Digits); // последняя цена ask mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit OrderSend(mrequest,mresult); // отсылаем ордер }
Но продолжает при условии открывать позиции при выполнении условия Buy_Signal. Мне нужно чтобы до наступления условия Sell_Signal позиции по Buy_Signal больше не открывались. Пытаюсь реализовать это так:
Но продолжает при условии открывать позиции при выполнении условия Buy_Signal. Мне нужно чтобы до наступления условия Sell_Signal позиции по Buy_Signal больше не открывались. Пытаюсь реализовать это так:
Не идет.
А почему именно такой код? Он даже с большой натяжкой не напоминает то что я имел введу (я вообще сомневаюсь в том что там все верно)
if(Buy_Signal && PositionSelect(Symbol())==false)
{
mrequest.type = ORDER_TYPE_BUY; // ордер на покупку
mrequest.price = NormalizeDouble(latest_price.ask,_Digits); // последняя цена ask
mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit OrderSend(mrequest,mresult); // отсылаем ордер
}
А я имел введу примерно вот это:
Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
SL = NormalizeDouble(Ask - 500*_Point,_Digits); // Stop Loss
TP = NormalizeDouble(Ask + 1500*_Point,_Digits); // Take Profitif(Buy_Signal)
//Получен сигнал на market buy
{
if(!PositionSelect(_Symbol))
//Позиции по данному символу отсутствуют
{
mrequest.action = TRADE_ACTION_DEAL; //Установка рыночного ордера (позиция)
mrequest.type = ORDER_TYPE_BUY; //Ордер на покупку
mrequest.magic = 18072010; //ORDER_MAGIC
mrequest.symbol = _Symbol; //Инструмент
mrequest.volume = 0.1; //Объем в 0.1 лот
mrequest.price = Ask; //Цена открытия
mrequest.sl = SL; //Stop Loss
mrequest.tp = TP; //Take Profit
mrequest.deviation = 5; //Отклонение в 5 пунктов OrderSend(mrequest,mresult); //Отсылаем ордер
}
}
Такой и выше код не откроют позицию пока она не закрыта, но откороют заново после закрытия на следующем баре при выполнении условия. Я реализовал это так:
bool BuyOne = true, SellOne = true; // только один ордер. глобальные переменные
if(Buy_Signal && // покупаем если есть сигнал на покупку PositionSelect(Symbol())==false && // ордер закрыт BuyOne) // при условии на покупку ставим только один ордер { mrequest.type = ORDER_TYPE_BUY; // ордер на покупку mrequest.price = NormalizeDouble(latest_price.ask,_Digits); // последняя цена ask mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit OrderSend(mrequest,mresult); // отсылаем ордер BuyOne = false; // на покупку только один ордер SellOne = true; // меняем флаг одного ордера на продажу }
Спасибо! Учел все пожелания. Сейчас все работает. Советник выложил для публикации. Можно и еще внести изменения в код. Совращенству нет предела )))
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
При тестировании экспертов:
Exp_TEMA.mq5,из статьи: "Создание эксперта, торгующего на разных инструментах" , выражения Told[] Tnew[1]получают следующие значения:
Told[] Expression could not be evaluated
Tnew[1] Invalid array range.
и My_First_EA.mq5, из статьи: "Пошаговое руководство по написанию MQL5-советников для начинающих", выражение
New_Time[1] получает значение:Invalid array range
Что обозначают значения Expression could not be evaluated,Invalid array range, и как они влияют на результаты работы экспертов?
Told - пустой массив без размера
Tnew[1] - выходит за пределы массива, массив описан как Tnew[1], поэтому к его элементам можно обращаться только как к Tnew[0], так как индекс начинается с нуля.
Told - пустой массив без размера
Tnew[1] - выходит за пределы массива, массив описан как Tnew[1], поэтому к его элементам можно обращаться только как к Tnew[0], так как индекс начинается с нуля.
Подскажите пожалуйста как открывать только одну сделку по условию. С моим кодом терминал открывает несколько сделок по данному условию, а нужно только одну.
В результате получается такая картинка:
Как проверить совершалась ли сделка с данными условиями или нет? Пробовал так не идет:
Подскажите пожалуйста как открывать только одну сделку по условию. С моим кодом терминал открывает несколько сделок по данному условию, а нужно только одну.
В результате получается такая картинка:
Как проверить совершалась ли сделка с данными условиями или нет? Пробовал так не идет:
А нафига устраивать перебор в цикле если есть такая замечательная вещица как PositionSelect?
Просто проверяем наличие позиции по интересующему нас инструменту и если возвращается true идем спокойно пить коньяк и курить сигары... :)
PS
При этом как я понимаю PositionGetString без PositionSelect работать не должна. Нам ведь не нужно узнать символы всех открытых поз, верно?
А нафига устраивать перебор в цикле если есть такая замечательная вещица как PositionSelect?
Просто проверяем наличие позиции по интересующему нас инструменту и если возвращается true идем спокойно пить коньяк и курить сигары... :)
PS
При этом как я понимаю PositionGetString без PositionSelect работать не должна. Нам ведь не нужно узнать символы всех открытых поз, верно?
Такой код учитывает наличие открытой позиции:
Но продолжает при условии открывать позиции при выполнении условия Buy_Signal. Мне нужно чтобы до наступления условия Sell_Signal позиции по Buy_Signal больше не открывались. Пытаюсь реализовать это так:
Не идет.Такой код учитывает наличие открытой позиции:
Но продолжает при условии открывать позиции при выполнении условия Buy_Signal. Мне нужно чтобы до наступления условия Sell_Signal позиции по Buy_Signal больше не открывались. Пытаюсь реализовать это так:
Не идет.А почему именно такой код? Он даже с большой натяжкой не напоминает то что я имел введу (я вообще сомневаюсь в том что там все верно)
А я имел введу примерно вот это:
На худой конец все можно оформить в блоке
А почему именно такой код? Он даже с большой натяжкой не напоминает то что я имел введу (я вообще сомневаюсь в том что там все верно)
А я имел введу примерно вот это:
На худой конец все можно оформить в блоке
Такой и выше код не откроют позицию пока она не закрыта, но откороют заново после закрытия на следующем баре при выполнении условия. Я реализовал это так:
Спасибо! Учел все пожелания. Сейчас все работает. Советник выложил для публикации. Можно и еще внести изменения в код. Совращенству нет предела )))