Ваши вопросы по языку MQL4

Артмен

Новичок форума
Спасибо! Я не внимателен, видать запарился с другой ошибкой в сове при прогоне в тестере (с которой тоже не знаю что делать) - array out of range in '(советник)'.
 

vladradon

Программист
при прогоне в тестере (с которой тоже не знаю что делать) - array out of range in '(советник)'.
Индексация элементов массива выходит за рамки допустимого - либо отрицательная, либо больше, чем задано в массиве ячеек. Там если массив на 5 ячеек int Array[5], то индексация от 0 до 4 будет - Array[0] - Array[4] и любая другая индексация будет выдавать такое сообщение об ошибке в строке советника, где идет выборка ячейки массива (в сообщении указывается имя сова, номер строки с массивом и количество знаков, начиная слева в этой строке, где происходит ошибка выборки).
 
Последнее редактирование:

Артмен

Новичок форума
Спасибо!(Батя напряг изучать MQL, и многое пока что не понятно).
 

_SERG_

Активный участник
Спасибо!(Батя напряг изучать MQL, и многое пока что не понятно).

Бате респект. :laugh:
Ток пусть ещё и творчески думать-анализировать тебя научит.
Ну и ты не копти, осваивай. :laugh:
 
Последнее редактирование:

_SERG_

Активный участник
О! Я про главное чуть не забыл!
Мышление должно быть критическим!
ВсЁЁЁЁЁЁЁЁ!!!!
 

Артмен

Новичок форума
(Пробел выскочил в ".com".)Я уже исправил эту ошибку.Просто скачал другую библиотеку, и вписал её.Помогите пожалуйста с другой ошибкой :D
'calcTma' - function must have a body:
double calcTma(int inx); //это в глобальной области
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
(Пробел выскочил в ".com".)Я уже исправил эту ошибку.Просто скачал другую библиотеку, и вписал её.Помогите пожалуйста с другой ошибкой :D
'calcTma' - function must have a body:
double calcTma(int inx); //это в глобальной области
Артмен, а ты в школе изучал аглицкий? Что-то мне кажется что нет как и я.
Я пользуюсь яндекс переводчиком и вот что он пишет
функция должна иметь тело
У тебя-же нет ничего. Может её просто удалить? А если к ней есть обращения из программы, то надо написать всё что должна выполнять эта функция.
 

Артмен

Новичок форума
Артмен, а ты в школе изучал аглицкий? Что-то мне кажется что нет как и я.
Я пользуюсь яндекс переводчиком и вот что он пишет

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

Спасибо! Удалил в общем я её, и вроде бы всё нормально ;)
(спросил я так, на всякий)
 

zliden

Новичок форума
Всех с наступившим!
Уважаемые, подскажите как добавить в сову контроль спреда.
Сова на стоповых отложках - что бы при превышении заданного спреда отложки удалялись.
 

vladradon

Программист
Всех с наступившим!
Уважаемые, подскажите как добавить в сову контроль спреда.
Сова на стоповых отложках - что бы при превышении заданного спреда отложки удалялись.
Дружище, присоединяюсь к поздравлению! Всех с праздниками!
Во первых не сова, а сов - сокращение от слова советник - мужского рода. Во вторых отложенники срабатывают независимо от заложенных в сова условий - это отрабатывает брокер, поэтому нужно использовать прямой вход в рынок. Если алгоритм не позволяет, то шансов мало.
 

vladradon

Программист
В честь праздников хочу очередной глюбк описать: Я использую автоматический переход с обычного трала на виртуальный и недавно нашел глюк на Робофорексе с этим связанный - получаемые данные (текущи котировки) имеют больше знаков поле запятой и если их не приводить принудительно, то алгоритм не всегда будет работать. Я привожу кусок кода из моего сова как пример, но это не для новичков в программировании. В чем ссмысл опытные прогере поймут. Обращать внимание на переменные не нужно. VirtualOnly - ключевая переменная, переводящая сова в виртуальный режим.
PHP:
  if(MarketInfo(_Symbol,MODE_STOPLEVEL)>0)
     {
      VirtualOnly=false;
      for(cnt=0; cnt<OrdersTotal(); cnt++)
        {
         if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol)
            if((TpSell>0 && (int)(MathAbs(OrderOpenPrice()-TpSell)/_Point)<=MarketInfo(_Symbol, MODE_STOPLEVEL)) ||
               (SlSell>0 && (int)(MathAbs(OrderOpenPrice()-SlSell)/_Point)<=MarketInfo(_Symbol, MODE_STOPLEVEL)))
               VirtualOnly=true;
        }
 

vladradon

Программист
В честь праздников хочу очередной глюк описать: Я использую автоматический переход с обычного трала на виртуальный и недавно нашел глюк на Робофорексе с этим связанный - получаемые данные (текущие котировки) имеют больше знаков после запятой и если их не приводить принудительно, то алгоритм не всегда будет работать. Я привожу кусок кода из моего сова как пример, но это не для новичков в программировании. В чем ссмысл опытные прогеры поймут. Обращать внимание на переменные не нужно. VirtualOnly - ключевая переменная, переводящая сова в виртуальный режим.
Исправил ошибки в тексте.:)
 

Артмен

Новичок форума
Здравствуйте товарищи программисты.Помогите пожалуйста исправить ошибку: при прогоне в тестере вообще не открывает ордера, при этом никаких ошибок либо предупреждений в мета-эдиторе не выдаёт.
int Order_open(int inx)
{
int ticket;
int Buy;
int Sell;
int Min_dis = 10;
int err=GetLastError();
//+------------------------------------------------------------------+
//| Покупка |
//+------------------------------------------------------------------+
if(gadblSlope[inx]>=edblHigh1 && gadblSlope[inx+1]<edblHigh1)
{
Buy = 1;
}
if(Buy == 1 && Ask-OrderOpenPrice()>Min_dis)
{
ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,Stoploss,Takeprofit,"Open_Buy",Magic,0,clrBuy);
if(ticket>0)Buy = 0; else Print("Ошибка открытия ордера",err);
}
//+------------------------------------------------------------------+
//| Продажа |
//+------------------------------------------------------------------+
if(gadblSlope[inx]<=edblLow1 && gadblSlope[inx+1]>edblLow1)
{
Sell = 1;
}
if(Sell == 1 && Ask-OrderOpenPrice()>Min_dis)
{
ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Stoploss,Takeprofit,"Open_Sell",Magic,0,clrSell);
if(ticket>0)Sell = 0; else Print("Ошибка открытия ордера",err);
}
return(0);
}
//+------------------------------------------------------------------+
 
Последнее редактирование:

vladradon

Программист
if(Buy == 1 && Ask-OrderOpenPrice()>Min_dis)
Дружище, с праздниками. У тебя в этих строках идет, насколько я понимаю, проверка на открытие не первых ордеров с минимальной дистанцией Min_dis, которую нужно привести к реальному стандарту (для любого счета) умножив на Point, т.е. if(Buy == 1 && Ask-OrderOpenPrice()>Min_dis*Point). Но не факт, что это единственная проблема - не видя всего кода всех проблем не увидишь.
 

mobidik

-----
PHP:
Buy = 1;
}
if(Buy == 1 && Ask-OrderOpenPrice()>Min_dis)
{
ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,Stoploss,Takeprofit,"Open_Buy",Magic,0,clrBuy);
if(ticket>0)Buy = 0; else Print("Ошибка открытия ордера",err);
}

А что вообще здесь делает: OrderOpenPrice()?
Что бы узнать цену открытия ордера, его предварительно нужно выбрать - из списка или по тикету. Вам какого ордера нужна цена открытия? Могу предположить, что последнего, так для этого нужно писать отдельную ф-цию. И еще одно: следует предусмотреть, что бы не было пачки ордеров на одном баре, т.к. у Вас будут открываться позиции на каждом тике на баре с сигналом.
 

vladradon

Программист
А что вообще здесь делает: OrderOpenPrice()?
Что бы узнать цену открытия ордера, его предварительно нужно выбрать - из списка или по тикету. Вам какого ордера нужна цена открытия? Могу предположить, что последнего, так для этого нужно писать отдельную ф-цию. И еще одно: следует предусмотреть, что бы не было пачки ордеров на одном баре, т.к. у Вас будут открываться позиции на каждом тике на баре с сигналом.
Вот и я про что - это открытие уже не первых ордеров.
А на меня ты зря психанул - функция Alert() в режиме тестирования и оптимизации в журнале работает (отписывает) как Print.
 
Последнее редактирование:

Артмен

Новичок форума
Покажите пожалуйста как правильно это делать:question: :please:
 
Последнее редактирование:
Верх