Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вот что получилось. Подскажите пожалуйста в чем ошибка. Заранее спасибо!
Здравствуйте!
Пишу сюда, т.к. на mq4 никого вроде как нет.
Подскажите пожалуйста, что я не правильно делаю? Вариант 2 не работает.
Здравствуйте! Помогите пожалуйста с написанием функции в MT4. Мне известен баланс счета(AccountBalance), известно сколько сделок у меня откроется(например 9),известен риск (например 3% от AccountBalance), мне нужно расчитать лот первой сделки, если каждый следующий лот будет увеличиваться в два раза и все сделки будут перекрывать друг друга одна за другой.
Вот что получилось. Подскажите пожалуйста в чем ошибка. Заранее спасибо!
Здравствуйте!
Пишу сюда, т.к. на mq4 никого вроде как нет.
Подскажите пожалуйста, что я не правильно делаю? Вариант 2 не работает.
Выделил: должно быть присвоение - "=", а у Вас сравнение - "==".
Всем привет !
Учусь писать роботов в mt4, решил начать с бинарных опционов . Пишу самого простого советника и компилятор выдает кучу предупреждений с которыми я разобраться не как не могу (
Помогите : " О гуру MQL4" =))))))
Заранее спасибо!)
Вот код советника.
//+------------------------------------------------------------------+
//| Bolinger_Bands_traider.mq4 |
//| Copyright 2017, Penrov Nikolay |
//| vk.com/buzamonolit |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Petrov Nikolay"
#property link "vk.com/buzamonolit"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
extern int Bolinger_Bands = 20; // Период Полос Боллинджера
extern double Delta = 0.0003; // На каком расстоянии открывать ордер
string Symb; // Название финанс. инструмента
int Total; // Количество ордеров
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
Initialize_Objects(0);
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
double price = Bid;
double CurrBol_High = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_UPPER, 0);
double CurrBol_Low = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_LOWER, 0);
double PriceBol_High = price - CurrBol_High;
double PriceBol_Low = price - CurrBol_Low;
datetime NextClose = Time[0] + Period()*60*2;
int MinutesToNextClose = (NextClose - TimeCurrent())/60 + 1;
int err;
// Учёт ордеров
Symb=Symbol(); // Название фин.инстр.
Total=0; // Количество ордеров
for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
if (OrderSymbol()!=Symb)continue; // Не наш фин. инструм
if (OrderType()>1) // Попался отложенный
{
Alert("Обнаружен отложенный ордер. Эксперт не работает.");
return(0); // Выход из start()
}
Total++; // Счётчик рыночн. орд
if (Total>1) // Не более одного орд
{
Alert("Несколько рыночных ордеров. Эксперт не работает.");
return(0); // Выход из start()
}
}
}
ObjectSetText("Obj_Label", "ТФ" + Period() + ", " + DoubleToStr(price, 5) + ", тик " + TimeToStr(TimeCurrent(), TIME_SECONDS) + ", O@" + TimeToStr(Time[0], TIME_MINUTES) + ", NC@" + TimeToStr(NextClose, TIME_MINUTES) + " (" + MinutesToNextClose + " min)", 10, "Arial", DarkGreen );
ObjectSetText("Obj_Label2", "Ордеров: " + Total + ", дельта " + DoubleToStr(Delta,5) + ", расст до MA:" + DoubleToStr(PriceBol_High, 5), 10, "Arial", DarkGreen );
ObjectSetText("Obj_Label3", "Ордеров: " + Total + ", дельта " + DoubleToStr(Delta,5) + ", расст до MA:" + DoubleToStr(PriceBol_Low, 5), 10, "Arial", DarkGreen );
// анализ цены и открытие ордеров
if ((MathAbs(PriceBol_Low) < Delta) && (price > CurrBol_Low) && (Open[0] > CurrBol_Low+Delta) && (Total<1))
{
if (OrderSend(Symbol(), OP_BUY, 1.00,Bid , 3, 0, 0,"BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Green) >0) Print ("Opened OK");
else
{
err=GetLastError();
Print("error(",err,")");
return(0);
}
Print ("CALL @ " + price + " " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp in " + MinutesToNextClose);
}
if ((MathAbs(PriceBol_High) < Delta) && (price < CurrBol_High) && (Open[0] < CurrBol_High-Delta) && (Total<1))
{
if (OrderSend(Symbol(), OP_SELL, 1.00,Bid , 3, 0, 0,"BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Red) > 0) Print ("Opened OK");
else
{
err=GetLastError();
Print("error(",err,")");
return(0);
}
Print ("PUT @ " + price + " " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp in " + MinutesToNextClose);
}
//----
return(0);
}
//+------------------------------------------------------------------+
int Initialize_Objects(int Win) // Пользовательс ф-ия
{ // ..создания объекта
ObjectCreate("Obj_Label",OBJ_LABEL, Win, 0,0); // Создание объекта
ObjectSet("Obj_Label", OBJPROP_CORNER, 0); // Привязка к углу
ObjectSet("Obj_Label", OBJPROP_XDISTANCE, 13); // Координата Х
if (Win==0)
ObjectSet("Obj_Label",OBJPROP_YDISTANCE, 15);// Координата Y
else
ObjectSet("Obj_Label",OBJPROP_YDISTANCE,15);// Координата Y
ObjectCreate("Obj_Label2",OBJ_LABEL, Win, 0,0); // Создание объекта
ObjectSet("Obj_Label2", OBJPROP_CORNER, 0); // Привязка к углу
ObjectSet("Obj_Label2", OBJPROP_XDISTANCE, 13); // Координата Х
if (Win==0)
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);// Координата Y
else
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);// Координата Y
ObjectCreate("Obj_Label3",OBJ_LABEL, Win, 0,0); // Создание объекта
ObjectSet("Obj_Label3", OBJPROP_CORNER, 0); // Привязка к углу
ObjectSet("Obj_Label3", OBJPROP_XDISTANCE, 13); // Координата Х
if (Win==0)
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);// Координата Y
else
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);// Координата Y
return(0); // Выход из польз.ф-ии
}
А вот предупреждения. Не могу понять , что ему не нравится(
possible loss of data due to type conversion Bolinger_Bands_traider.mq4 51 24
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 76 35
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 76 227
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 77 43
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 78 43
implicit conversion from 'string' to 'number' Bolinger_Bands_traider.mq4 85 71
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 93 23
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 93 91
implicit conversion from 'string' to 'number' Bolinger_Bands_traider.mq4 99 72
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 107 23
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 107 91
0 error(s), 11 warning(s), compile time: 204 msec 1 12
Элементарно. Ошибка - функция GetLots(). Вся функция.
Может подскажете как правильно написать. Я хотел вычислить с помощью цикла путем перебора от максимального лота.
Может подскажете как правильно написать. Я хотел вычислить с помощью цикла путем перебора от максимального лота.
А где логика? Вы ставите на первый ордер максимальный разрешенный лот, а потом увеличиваете его для каждого следующего ордера. Вам это не кажется, мягко говоря, не очень разумным?
Далее, вы уменьшаете в цикле лот первого ордера каким-то совсем уже не поддающимся логике методом, а лоты остальных ордеров, которые были "вычислены" до этого, так и остаются, без изменений, притом, за пределы этой фукции эти значения не выходят никак. Зачем тогда они?
Не говоря уж о том, что инкремент цикла не может быть вещественным числом, это счётчик, целое число должно быть. А вы ставите в качестве счётчика значение лота и вычитаете из него каждую итерацию по единичке. Это крупная ошибка, очень серьёзная.
Доработайте логику сначала в голове, а потом уже пытайтесь воплотить её в код.
А вот предупреждения. Не могу понять , что ему не нравится(
possible loss of data due to type conversion Bolinger_Bands_traider.mq4 51 24
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 76 35
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 76 227
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 77 43
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 78 43
implicit conversion from 'string' to 'number' Bolinger_Bands_traider.mq4 85 71
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 93 23
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 93 91
implicit conversion from 'string' to 'number' Bolinger_Bands_traider.mq4 99 72
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 107 23
implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 107 91
0 error(s), 11 warning(s), compile time: 204 msec 1 12
Выведите одну строку с номером 51, т.к. здесь не посчитать, чтобы понять ошибку "possible loss of data due to type conversion Bolinger_Bands_traider.mq4 51 24"
Остальное: "implicit conversion from 'number' to 'string' Bolinger_Bands_traider.mq4 107 91" говорит о том что надо:
переведите числовые значения в текстовую строку там где создаем объект - текстовую строку, например
Period()
должно быть
DoubleToString(Period(),0)
переведите числовые значения в текстовую строку там где создаем объект - текстовую строку, например
Period()
должно быть
DoubleToString(Period(),0)
А с каких это пор период - типа Double?