Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Глубоко уважаемые программистя и вновь я нуждаюсь в вашей помощи, помогите советом
и или правильно написанным кодом с пояснениями(что будет лучше)

Написал советник знаю много строк кода, и вроде всё правильно но вылазит одна ошибка на компиляции и если убрать слешами она исчезает но появляется во время работы советника SendOrder error 4501

Стратегия советника
от максимума за 10 дней прошло 50 пунктов вниз то открываются ордера селл
если от минимума прошло 50 пунктов верх то открываются ордера бай

по причине того что советник начал сливать я перевернул основные ордера и поставил их лот на автоматическое вычилсления переменная А задаёт на какое число будет делиться депозит для определения автоматически лота для основного ордера

Проблема возникла при вставке функции определения какая ошибка и выставление соответствующего основного ордера


//+------------------------------------------------------------------+
//| МА_50-20.mq4 |
//| Copyright 2016, https://vk.com/id266344775 |
//| https://vk.com/id266344775 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, https://vk.com/id266344775"
#property link "https://vk.com/id266344775"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
extern string text = "Работает только на Дневном графикех";
extern int Magic = 12345;
extern int Moy = 5;
extern int Slippage = 4;
extern int A = 15000;
extern int TakeProfit = 20;
extern int StopLoss = 20;
extern double multipler = 1.5;
extern int day = 10;
//+------------------------------------------------------------------+
extern bool type;
double Lots,Lots_sell,Lots_buy,cLots,SL,TP,p,maxp,minp;
int ticket;
//+------------------------------------------------------------------+
int OnInit()
{double multiplier;
if(Digits == 2 || Digits == 4)
multiplier = 1;
if(Digits == 3 || Digits == 5)
multiplier = 10;
if(Digits == 6) multiplier = 100;
TakeProfit*= multiplier;
StopLoss *= multiplier;
Slippage *= multiplier;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{}
//+------------------------------------------------------------------+
void OnTick()
//int start()
{
Comment( "-----------------------------------------------------------",
"\n"," Account: - №: ",AccountNumber(),
"\n"," TimeCurrent: - : ",TimeCurrent(),
"\n"," AccountCompany ",AccountCompany(),
"\n"," AccountLeverage 1 : ",AccountLeverage(),
"\n","-----------------------------------------------------------",
"\n"," AccountBalance ",NormalizeDouble(AccountBalance(),2),
"\n"," AccountMargin ",NormalizeDouble(AccountMargin(),2),
"\n"," AccountEquity ",NormalizeDouble(AccountEquity(),2),
"\n"," Lots ",cLots,
"\n","-----------------------------------------------------------");
//+------------------------------------------------------------------
GetLots();
Lots=cLots;
if (isCloseLastPosByStop(Symbol(),OP_SELL,-1))
{NormalizeDouble(Lots_sell=GetLotLastPos(Symbol(),OP_SELL,Magic)*multipler,2);
}
else
{
Lots_sell=Lots;
}
if (isCloseLastPosByStop(Symbol(),OP_BUY, -1))
{NormalizeDouble(Lots_buy =GetLotLastPos(Symbol(), OP_BUY,Magic)*multipler,2);
}
else
{
Lots_buy=Lots;
}
//+------------------------------------------------------------------
//Open orders
//+------------------------------------------------------------------+
MaxPrice();
MinPrice();

if(maxp-.005>Ask)
{type=true;}
if(minp+.005 {type=false
;}
// Fun_Error();
if(CountBuy()==0)
if(type==false)
{Print ("сигнал buy");
SL=NormalizeDouble(Ask-StopLoss*0.0001,4);
TP=NormalizeDouble(Ask+TakeProfit*0.0001,4);
ticket=OrderSend(Symbol(),OP_BUY, 0.01, NormalizeDouble(Ask,4),Slippage,SL,TP,"МА_50-20",Magic,0,Blue);
if(ticket Print("Не удалось открыть ордер на покупку");
SL=NormalizeDouble(Bid+TakeProfit*0.0001+.0002,4);
TP=NormalizeDouble(Bid-StopLoss*0.0001+.0002,4);
ticket=OrderSend(Symbol(),OP_SELL,Lots_sell, NormalizeDouble(Bid,4),Slippage,SL,TP,"МА_50-20",Moy,0,Red);
if(ticket Print("Не удалось открыть основной ордер на продажу");
}
if(CountSell()==0)
if(type==true)
{Print ("сигнал sell");
SL=NormalizeDouble(Bid+StopLoss*0.0001,4);
TP=NormalizeDouble(Bid-TakeProfit*0.0001,4);
ticket=OrderSend(Symbol(),OP_SELL,0.01, NormalizeDouble(Bid,4),Slippage,SL,TP,"МА_50-20",Magic,0,Red);
if(ticket Print("Не удалось открыть ордер на продажу");
SL=NormalizeDouble(Ask-TakeProfit*0.0001-.0002,4);
TP=NormalizeDouble(Ask+StopLoss*0.0001-.0002,4);
ticket=OrderSend(Symbol(),OP_BUY, Lots_buy, NormalizeDouble(Ask,4),Slippage,SL,TP,"МА_50-20",Moy,0,Blue);
if(ticket Print("Не удалось открыть основной ордер на покупку");
}

//+------------------------------------------------------------------+
}
//+------------------------------------------------------------------+
void MaxPrice()
{ for(int i = 0; i { p=iHigh(Symbol(),PERIOD_D1,i);
if(p>maxp)
{maxp=p;
}
}
return;
}

void MinPrice()
{ for(int i = 0; i { p=iLow(Symbol(),PERIOD_D1,i);
if(p {minp=p;
}
}
return;
}
double GetLots()
{ cLots = AccountBalance()/A;
cLots = MathMax(cLots, MarketInfo(Symbol(),MODE_MINLOT));
cLots = MathMin(cLots, MarketInfo(Symbol(),MODE_MAXLOT));
cLots = NormalizeDouble(cLots,2);
return(cLots);}
int CountSell()
{ int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)==true &&
OrderMagicNumber()==Magic&&
OrderType()==OP_SELL)
{count++;
}
}
return(count);
}
int CountBuy()
{ int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)==true &&
OrderMagicNumber()==Magic&&
OrderType()==OP_BUY)
{count++;
}
}
return(count);
}
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
datetime t=0;
double ocp, osl;
int dg, i, j=-1, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
for (i=0; i if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op if (mn if (t t=OrderCloseTime();
j=i;
}
}
}
}
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(sy, MODE_DIGITS);
if (dg==0) if (StringFind(OrderSymbol(), "JPY") ocp=NormalizeDouble(OrderClosePrice(), dg);
osl=NormalizeDouble(OrderStopLoss(), dg);
if (ocp==osl) return(True);
}
return(False);
}

double GetLotLastPos(string sy="", int op=-1, int mn=-1) {
datetime o=0;
double l=-1;
int i, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
for (i=0; i if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op if (mn if (o o=OrderCloseTime();
l=OrderLots();
}
}
}
}
}
}
}
return(l);
}
int Fun_Error(int Error)
{ switch(Error)
{ // Преодолимые ошибки
case 0: return (0);
case 1: Print("Попытка изменить уже установленные значения такими же значениями.");return(1);
case 2: Print("Общая ошибка. Прекратить все попытки торговых операций до выяснения обстоятельств.");return(0);
case 3: Print("В торговую функцию переданы неправильные параметры.");return(1);
case 4: Print("Торговый сервер занят.Пробуем ещё раз..");Sleep(3000);return(1);
case 5: Print("Старая версия клиентского терминала.");return(0);
case 6: Print("Нет связи с торговым сервером.");return(1);
case 7: Print("Недостаточно прав.");return(1);
case 8: Print("Слишком частые запросы.");return(1);
case 9: Print("Недопустимая операция нарушающая функционирование сервера.");return(1);
case 64: Print("Счет заблокирован. Необходимо прекратить все попытки торговых операций.");return(0);
case 65: Print("Неправильный номер счета.");return(1);
case 128: Print("Истек срок ожидания совершения сделки.");return(1);
case 129: Print("Неправильная цена bid или ask, возможно, ненормализованная цена.");return(1);
case 130: Print("Слишком близкие стопы или неправильно рассчитанные или ненормализованные цены в стопах (или в цене открытия отложенного ордера).");return(1);
case 131: Print("Неправильный объем, ошибка в грануляции объема.");return(1);
case 132: Print("Рынок закрыт.");return(1);
case 133: Print("Торговля запрещена.");return(0);
case 134: Print("Недостаточно денег для совершения операции.");return(0);
case 135: Print("Цена изменилась. Пробуем ещё раз..");RefreshRates();return(1);
case 136: Print("Нет цен. Ждём новый тик..");
while(RefreshRates()==false) // До нового тика
Sleep(1);
return(1);
case 137: Print("Брокер занят.Пробуем ещё раз..");Sleep(3000);return(1);
case 138: Print("Запрошенная цена устарела, либо перепутаны bid и ask.");return(1);
case 139: Print("Ордер заблокирован и уже обрабатывается.");return(1);
case 140: Print("Разрешена только покупка. Повторять операцию SELL нельзя.");return(1);
case 141: Print("Слишком много запросов.");return(1);
case 142: Print("Ордер поставлен в очередь.");return(1);
case 143: Print("Ордер принят дилером к исполнению.");return(1);
case 144: Print("Ордер аннулирован самим клиентом при ручном подтверждении сделки.");return(1);
case 145: Print("Модификация запрещена, так как ордер слишком близок к рынку и заблокирован из-за возможного скорого исполнения.");return(1);
case 146: Print("Подсистема торговли занята.Пробуем ещё..");Sleep(500);return(1);
case 147: Print("Использование даты истечения ордера запрещено брокером.");return(1);
case 148: Print("Количество открытых и отложенных ордеров достигло предела, установленного брокером.");return(1);
case 149: Print("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.");return(1);
case 4000: return (0);
case 4001: Print("Неправильный указатель функции.");return(1);
case 4002: Print("Индекс массива - вне диапазона.");return(1);
case 4003: Print("Нет памяти для стека функций.");return(1);
case 4004: Print("Переполнение стека после рекурсивного вызова.");return(1);
case 4005: Print("На стеке нет памяти для передачи параметров.");return(1);
case 4006: Print("Нет памяти для строкового параметра.");return(1);
case 4007: Print("Нет памяти для временной строки.");return(1);
case 4008: Print("Неинициализированная строка.");return(1);
case 4009: Print("Неинициализированная строка в массиве.");return(1);
case 4010: Print("Нет памяти для строкового массива.");return(1);
case 4011: Print("Слишком длинная строка.");return(1);
case 4012: Print("Остаток от деления на ноль.");return(1);
case 4013: Print("Деление на ноль.");return(1);
case 4014: Print("Неизвестная команда.");return(1);
case 4015: Print("Неправильный переход.");return(1);
case 4016: Print("Неинициализированный массив.");return(1);
case 4017: Print("Вызовы DLL не разрешены.");return(1);
case 4018: Print("Невозможно загрузить библиотеку.");return(1);
case 4019: Print("Невозможно вызвать функцию.");return(1);
case 4020: Print("Вызовы внешних библиотечных функций не разрешены.");return(1);
case 4021: Print("Недостаточно памяти для строки, возвращаемой из функции.");return(1);
case 4022: Print("Система занята.");return(1);
case 4050: Print("Неправильное количество параметров функции.");return(1);
case 4051: Print("Недопустимое значение параметра функции.");return(1);
case 4052: Print("Внутренняя ошибка строковой функции.");return(1);
case 4053: Print("Ошибка массива.");return(1);
case 4054: Print("Неправильное использование массива-таймсерии.");return(1);
case 4055: Print("Ошибка пользовательского индикатора.");return(1);
case 4056: Print("Массивы несовместимы.");return(1);
case 4057: Print("Ошибка обработки глобальныех переменных.");return(1);
case 4058: Print("Глобальная переменная не обнаружена.");return(1);
case 4059: Print("Функция не разрешена в тестовом режиме.");return(1);
case 4060: Print("Функция не подтверждена.");return(1);
case 4061: Print("Ошибка отправки почты.");return(1);
case 4062: Print("Ожидается параметр типа string.");return(1);
case 4063: Print("Ожидается параметр типа integer.");return(1);
case 4064: Print("Ожидается параметр типа double.");return(1);
case 4065: Print("В качестве параметра ожидается массив.");return(1);
case 4066: Print("Запрошенные исторические данные в состоянии обновления.");return(1);
case 4067: Print("Ошибка при выполнении торговой операции.");return(1);
case 4099: Print("Конец файла.");return(1);
case 4100: Print("Ошибка при работе с файлом.");return(1);
case 4101: Print("Неправильное имя файла.");return(1);
case 4102: Print("Слишком много открытых файлов.");return(1);
case 4103: Print("Невозможно открыть файл.");return(1);
case 4104: Print("Несовместимый режим доступа к файлу.");return(1);
case 4105: Print("Ни один ордер не выбран.");return(1);
case 4106: Print("Неизвестный символ.");return(1);
case 4107: Print("Неправильный параметр цены для торговой функции.");return(1);
case 4108: Print("Неверный номер тикета.");return(1);
case 4109: Print("Торговля не разрешена. Необходимо включить опцию Разрешить советнику торговать в свойствах эксперта.");return(1);
case 4110: Print("Длинные позиции не разрешены. Необходимо проверить свойства эксперта.");return(1);
case 4111: Print("Короткие позиции не разрешены. Необходимо проверить свойства эксперта.");return(1);
case 4200: Print("Объект уже существует.");return(1);
case 4201: Print("Запрошено неизвестное свойство объекта.");return(1);
case 4202: Print("Объект не существует.");return(1);
case 4203: Print("Неизвестный тип объекта.");return(1);
case 4204: Print("Нет имени объекта.");return(1);
case 4205: Print("Ошибка координат объекта.");return(1);
case 4206: Print("Не найдено указанное подокно.");return(1);
case 4207: Print("Ошибка при работе с объектом.");return(1);
return(0);
}
return(0);
}
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
Спойлер

Спасибо конечно за бесплатный урок, но учитель из вас не важный, так и не понял зачем мне кнопка если мне нужна линия?
Неужели фраза о том что я хочу вывести на экран Машку настолько не понятна?


Уважаемый, SNZHikari, вам здесь никто не должен. Вы явно грубите, и, в какой-то степени, уменьшаете желание опытных программистов отвечать вообще. Будьте благодарны, что на вас потратили драгоценное время. Если полученная информация вас не удовлетворила, можно попытаться еще раз донести суть вашей ПРОСЬБЫ!!!
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Всем привет. Встречал ли кто нибудь такой расчет сети, чтоб можно было ввести стоимость пунктов, шаг, количество и объем ордеров, чтоб программа расчитала полный лок сети стоповых ордеров, т.е какой убыток будет у сети если все ордеры сработали?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Глубоко уважаемые программистя и вновь я нуждаюсь в вашей помощи, помогите советом
и или правильно написанным кодом с пояснениями(что будет лучше)

Написал советник знаю много строк кода, и вроде всё правильно но вылазит одна ошибка на компиляции и если убрать слешами она исчезает но появляется во время работы советника SendOrder error 4501

Стратегия советника
от максимума за 10 дней прошло 50 пунктов вниз то открываются ордера селл
если от минимума прошло 50 пунктов верх то открываются ордера бай

по причине того что советник начал сливать я перевернул основные ордера и поставил их лот на автоматическое вычилсления переменная А задаёт на какое число будет делиться депозит для определения автоматически лота для основного ордера

Проблема возникла при вставке функции определения какая ошибка и выставление соответствующего основного ордера


//+------------------------------------------------------------------+
//| МА_50-20.mq4 |
//| Copyright 2016, https://vk.com/id266344775 |
//| https://vk.com/id266344775 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, https://vk.com/id266344775"
#property link "https://vk.com/id266344775"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
extern string text = "Работает только на Дневном графикех";
extern int Magic = 12345;
extern int Moy = 5;
extern int Slippage = 4;
extern int A = 15000;
extern int TakeProfit = 20;
extern int StopLoss = 20;
extern double multipler = 1.5;
extern int day = 10;
//+------------------------------------------------------------------+
extern bool type;
double Lots,Lots_sell,Lots_buy,cLots,SL,TP,p,maxp,minp;
int ticket;
//+------------------------------------------------------------------+
int OnInit()
{double multiplier;
if(Digits == 2 || Digits == 4)
multiplier = 1;
if(Digits == 3 || Digits == 5)
multiplier = 10;
if(Digits == 6) multiplier = 100;
TakeProfit*= multiplier;
StopLoss *= multiplier;
Slippage *= multiplier;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{}
//+------------------------------------------------------------------+
void OnTick()
//int start()
{
Comment( "-----------------------------------------------------------",
"\n"," Account: - №: ",AccountNumber(),
"\n"," TimeCurrent: - : ",TimeCurrent(),
"\n"," AccountCompany ",AccountCompany(),
"\n"," AccountLeverage 1 : ",AccountLeverage(),
"\n","-----------------------------------------------------------",
"\n"," AccountBalance ",NormalizeDouble(AccountBalance(),2),
"\n"," AccountMargin ",NormalizeDouble(AccountMargin(),2),
"\n"," AccountEquity ",NormalizeDouble(AccountEquity(),2),
"\n"," Lots ",cLots,
"\n","-----------------------------------------------------------");
//+------------------------------------------------------------------
GetLots();
Lots=cLots;
if (isCloseLastPosByStop(Symbol(),OP_SELL,-1))
{NormalizeDouble(Lots_sell=GetLotLastPos(Symbol(),OP_SELL,Magic)*multipler,2);
}
else
{
Lots_sell=Lots;
}
if (isCloseLastPosByStop(Symbol(),OP_BUY, -1))
{NormalizeDouble(Lots_buy =GetLotLastPos(Symbol(), OP_BUY,Magic)*multipler,2);
}
else
{
Lots_buy=Lots;
}
//+------------------------------------------------------------------
//Open orders
//+------------------------------------------------------------------+
MaxPrice();
MinPrice();

if(maxp-.005>Ask)
{type=true;}
if(minp+.005 {type=false
;}
// Fun_Error();
if(CountBuy()==0)
if(type==false)
{Print ("сигнал buy");
SL=NormalizeDouble(Ask-StopLoss*0.0001,4);
TP=NormalizeDouble(Ask+TakeProfit*0.0001,4);
ticket=OrderSend(Symbol(),OP_BUY, 0.01, NormalizeDouble(Ask,4),Slippage,SL,TP,"МА_50-20",Magic,0,Blue);
if(ticket Print("Не удалось открыть ордер на покупку");
SL=NormalizeDouble(Bid+TakeProfit*0.0001+.0002,4);
TP=NormalizeDouble(Bid-StopLoss*0.0001+.0002,4);
ticket=OrderSend(Symbol(),OP_SELL,Lots_sell, NormalizeDouble(Bid,4),Slippage,SL,TP,"МА_50-20",Moy,0,Red);
if(ticket Print("Не удалось открыть основной ордер на продажу");
}
if(CountSell()==0)
if(type==true)
{Print ("сигнал sell");
SL=NormalizeDouble(Bid+StopLoss*0.0001,4);
TP=NormalizeDouble(Bid-TakeProfit*0.0001,4);
ticket=OrderSend(Symbol(),OP_SELL,0.01, NormalizeDouble(Bid,4),Slippage,SL,TP,"МА_50-20",Magic,0,Red);
if(ticket Print("Не удалось открыть ордер на продажу");
SL=NormalizeDouble(Ask-TakeProfit*0.0001-.0002,4);
TP=NormalizeDouble(Ask+StopLoss*0.0001-.0002,4);
ticket=OrderSend(Symbol(),OP_BUY, Lots_buy, NormalizeDouble(Ask,4),Slippage,SL,TP,"МА_50-20",Moy,0,Blue);
if(ticket Print("Не удалось открыть основной ордер на покупку");
}

//+------------------------------------------------------------------+
}
//+------------------------------------------------------------------+
void MaxPrice()
{ for(int i = 0; i { p=iHigh(Symbol(),PERIOD_D1,i);
if(p>maxp)
{maxp=p;
}
}
return;
}

void MinPrice()
{ for(int i = 0; i { p=iLow(Symbol(),PERIOD_D1,i);
if(p {minp=p;
}
}
return;
}
double GetLots()
{ cLots = AccountBalance()/A;
cLots = MathMax(cLots, MarketInfo(Symbol(),MODE_MINLOT));
cLots = MathMin(cLots, MarketInfo(Symbol(),MODE_MAXLOT));
cLots = NormalizeDouble(cLots,2);
return(cLots);}
int CountSell()
{ int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)==true &&
OrderMagicNumber()==Magic&&
OrderType()==OP_SELL)
{count++;
}
}
return(count);
}
int CountBuy()
{ int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)==true &&
OrderMagicNumber()==Magic&&
OrderType()==OP_BUY)
{count++;
}
}
return(count);
}
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
datetime t=0;
double ocp, osl;
int dg, i, j=-1, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
for (i=0; i if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op if (mn if (t t=OrderCloseTime();
j=i;
}
}
}
}
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(sy, MODE_DIGITS);
if (dg==0) if (StringFind(OrderSymbol(), "JPY") ocp=NormalizeDouble(OrderClosePrice(), dg);
osl=NormalizeDouble(OrderStopLoss(), dg);
if (ocp==osl) return(True);
}
return(False);
}

double GetLotLastPos(string sy="", int op=-1, int mn=-1) {
datetime o=0;
double l=-1;
int i, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
for (i=0; i if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op if (mn if (o o=OrderCloseTime();
l=OrderLots();
}
}
}
}
}
}
}
return(l);
}
int Fun_Error(int Error)
{ switch(Error)
{ // Преодолимые ошибки
case 0: return (0);
case 1: Print("Попытка изменить уже установленные значения такими же значениями.");return(1);
case 2: Print("Общая ошибка. Прекратить все попытки торговых операций до выяснения обстоятельств.");return(0);
case 3: Print("В торговую функцию переданы неправильные параметры.");return(1);
case 4: Print("Торговый сервер занят.Пробуем ещё раз..");Sleep(3000);return(1);
case 5: Print("Старая версия клиентского терминала.");return(0);
case 6: Print("Нет связи с торговым сервером.");return(1);
case 7: Print("Недостаточно прав.");return(1);
case 8: Print("Слишком частые запросы.");return(1);
case 9: Print("Недопустимая операция нарушающая функционирование сервера.");return(1);
case 64: Print("Счет заблокирован. Необходимо прекратить все попытки торговых операций.");return(0);
case 65: Print("Неправильный номер счета.");return(1);
case 128: Print("Истек срок ожидания совершения сделки.");return(1);
case 129: Print("Неправильная цена bid или ask, возможно, ненормализованная цена.");return(1);
case 130: Print("Слишком близкие стопы или неправильно рассчитанные или ненормализованные цены в стопах (или в цене открытия отложенного ордера).");return(1);
case 131: Print("Неправильный объем, ошибка в грануляции объема.");return(1);
case 132: Print("Рынок закрыт.");return(1);
case 133: Print("Торговля запрещена.");return(0);
case 134: Print("Недостаточно денег для совершения операции.");return(0);
case 135: Print("Цена изменилась. Пробуем ещё раз..");RefreshRates();return(1);
case 136: Print("Нет цен. Ждём новый тик..");
while(RefreshRates()==false) // До нового тика
Sleep(1);
return(1);
case 137: Print("Брокер занят.Пробуем ещё раз..");Sleep(3000);return(1);
case 138: Print("Запрошенная цена устарела, либо перепутаны bid и ask.");return(1);
case 139: Print("Ордер заблокирован и уже обрабатывается.");return(1);
case 140: Print("Разрешена только покупка. Повторять операцию SELL нельзя.");return(1);
case 141: Print("Слишком много запросов.");return(1);
case 142: Print("Ордер поставлен в очередь.");return(1);
case 143: Print("Ордер принят дилером к исполнению.");return(1);
case 144: Print("Ордер аннулирован самим клиентом при ручном подтверждении сделки.");return(1);
case 145: Print("Модификация запрещена, так как ордер слишком близок к рынку и заблокирован из-за возможного скорого исполнения.");return(1);
case 146: Print("Подсистема торговли занята.Пробуем ещё..");Sleep(500);return(1);
case 147: Print("Использование даты истечения ордера запрещено брокером.");return(1);
case 148: Print("Количество открытых и отложенных ордеров достигло предела, установленного брокером.");return(1);
case 149: Print("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.");return(1);
case 4000: return (0);
case 4001: Print("Неправильный указатель функции.");return(1);
case 4002: Print("Индекс массива - вне диапазона.");return(1);
case 4003: Print("Нет памяти для стека функций.");return(1);
case 4004: Print("Переполнение стека после рекурсивного вызова.");return(1);
case 4005: Print("На стеке нет памяти для передачи параметров.");return(1);
case 4006: Print("Нет памяти для строкового параметра.");return(1);
case 4007: Print("Нет памяти для временной строки.");return(1);
case 4008: Print("Неинициализированная строка.");return(1);
case 4009: Print("Неинициализированная строка в массиве.");return(1);
case 4010: Print("Нет памяти для строкового массива.");return(1);
case 4011: Print("Слишком длинная строка.");return(1);
case 4012: Print("Остаток от деления на ноль.");return(1);
case 4013: Print("Деление на ноль.");return(1);
case 4014: Print("Неизвестная команда.");return(1);
case 4015: Print("Неправильный переход.");return(1);
case 4016: Print("Неинициализированный массив.");return(1);
case 4017: Print("Вызовы DLL не разрешены.");return(1);
case 4018: Print("Невозможно загрузить библиотеку.");return(1);
case 4019: Print("Невозможно вызвать функцию.");return(1);
case 4020: Print("Вызовы внешних библиотечных функций не разрешены.");return(1);
case 4021: Print("Недостаточно памяти для строки, возвращаемой из функции.");return(1);
case 4022: Print("Система занята.");return(1);
case 4050: Print("Неправильное количество параметров функции.");return(1);
case 4051: Print("Недопустимое значение параметра функции.");return(1);
case 4052: Print("Внутренняя ошибка строковой функции.");return(1);
case 4053: Print("Ошибка массива.");return(1);
case 4054: Print("Неправильное использование массива-таймсерии.");return(1);
case 4055: Print("Ошибка пользовательского индикатора.");return(1);
case 4056: Print("Массивы несовместимы.");return(1);
case 4057: Print("Ошибка обработки глобальныех переменных.");return(1);
case 4058: Print("Глобальная переменная не обнаружена.");return(1);
case 4059: Print("Функция не разрешена в тестовом режиме.");return(1);
case 4060: Print("Функция не подтверждена.");return(1);
case 4061: Print("Ошибка отправки почты.");return(1);
case 4062: Print("Ожидается параметр типа string.");return(1);
case 4063: Print("Ожидается параметр типа integer.");return(1);
case 4064: Print("Ожидается параметр типа double.");return(1);
case 4065: Print("В качестве параметра ожидается массив.");return(1);
case 4066: Print("Запрошенные исторические данные в состоянии обновления.");return(1);
case 4067: Print("Ошибка при выполнении торговой операции.");return(1);
case 4099: Print("Конец файла.");return(1);
case 4100: Print("Ошибка при работе с файлом.");return(1);
case 4101: Print("Неправильное имя файла.");return(1);
case 4102: Print("Слишком много открытых файлов.");return(1);
case 4103: Print("Невозможно открыть файл.");return(1);
case 4104: Print("Несовместимый режим доступа к файлу.");return(1);
case 4105: Print("Ни один ордер не выбран.");return(1);
case 4106: Print("Неизвестный символ.");return(1);
case 4107: Print("Неправильный параметр цены для торговой функции.");return(1);
case 4108: Print("Неверный номер тикета.");return(1);
case 4109: Print("Торговля не разрешена. Необходимо включить опцию Разрешить советнику торговать в свойствах эксперта.");return(1);
case 4110: Print("Длинные позиции не разрешены. Необходимо проверить свойства эксперта.");return(1);
case 4111: Print("Короткие позиции не разрешены. Необходимо проверить свойства эксперта.");return(1);
case 4200: Print("Объект уже существует.");return(1);
case 4201: Print("Запрошено неизвестное свойство объекта.");return(1);
case 4202: Print("Объект не существует.");return(1);
case 4203: Print("Неизвестный тип объекта.");return(1);
case 4204: Print("Нет имени объекта.");return(1);
case 4205: Print("Ошибка координат объекта.");return(1);
case 4206: Print("Не найдено указанное подокно.");return(1);
case 4207: Print("Ошибка при работе с объектом.");return(1);
return(0);
}
return(0);
}



2016.10.26 09:56:00.707 2009.01.12 02:40 Ex EURUSD,Daily: invalid lots amount for OrderSend function
там с лотом ошибка наверное, попробовал нормализовать 2 после запятой, все равно ошибка.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

попробуй принтом вывести в лог значение лота перед открытием ордера. будет понятно хотя бы чему равна эта переменная(0 или > максимально допустимого брокером лота) и откуда ноги растут у этой ошибки.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Уважаемые господа програмеры. Такая ситуация, нужно заглянуть в ex4 нового билда. На сколько я понимаю, MetaQuots что-то там намудрили с защитой и это стало проблематично. НО. Умельцы всегда найдутся что-то вскрыть))) Если кто располагает информацией как заглянуть в исходник из под ex4 буду благодарен за помощь))

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

индикатор подправленный для алекс профит.

Indicators.ex4
Indicators.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Есть заготовка индикатора, нужно довести его до нормального состояния.
Сейчас он вот так отображает всё. Сплошная линия - один вариант, штриховая - другой.
Нужно нормально написать, чтобы он не "задумывался" надолго

eurusd-h1-oanda-division1.png

Изменено пользователем Daletar
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Можно вас попросить немножко доработать индикатор. Самую малость. Я писал сообщение что именно нужно сделать.
Но не знаю получили вы его или нет.
Спасибо за отзывчивость.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Нет ли совы для открытия позиций бинарных опционов в заданное время и определённую сторону?
Если нет , подскажите пожалуйста как написать.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Доброго времени суток, господа программисты!

Прошу не судить строго, я еще не спец в программировании. Только учусь. Написал индюка. Но проблема в том, что он не обновляется. То есть новые свечи появляются, а индюк их не обрабатывает. Надо сменить таймфрейм или переключиться между инструментами, тогда индикатор дорисуется. Подскажите, в чем может быть проблема? И еще одна непонятка. Если хочу поменять местами инструменты или перевернуть индикатор (например использую Inst_1_1 = 1/Inst_1_1), то на некоторых таймфреймах перестает отрисовываться средняя на индикаторе (везде отрисовывается, а на H4 и D1 - нет). Может кто то подскажет что это может быть? :/ Вроде ерунда, две строчки кода эта средняя, но никак не могу понять что с ней не так :/

Вот код:

int OnCalculate (const int rates_total,
const int prev_calculated,
const datetime& time[],
const double& open[],
const double& high[],
const double& low[],
const double& close[],
const long& tick_volume[],
const long& volume[],
const int& spread[])
{

int i,limit;
limit = rates_total - prev_calculated;
if(prev_calculated > 0)
limit++;

for(i = 0; i {
double Inst_1_1 = iClose(Instrument_1_1, 0, i);
if(Inst_Per_1_1 == true) Inst_1_1 = 1/Inst_1_1;

double Inst_1_2 = iClose(Instrument_1_2, 0, i);
if(Inst_Per_1_2 == true) Inst_1_2 = 1/Inst_1_2;

Korel_Buffer[ i ]=Inst_1_1 / Inst_1_2;

if(Buffers == 2)
{
double Inst_2_1 = iClose(Instrument_2_1, 0, i);
if(Inst_Per_2_1 == true) Inst_2_1 = 1/Inst_2_1;

double Inst_2_2 = iClose(Instrument_2_2, 0, i);
if(Inst_Per_2_2 == true) Inst_2_2 = 1/Inst_2_2;

Korel_Buffer2[ i ]=(Inst_2_1 / Inst_2_2) + Podnyat_Graf;
}
}

if(Ris_Srednyaya == true)
{
for(i = 0; i {
int j = 0;
double Summa = 0;

for(j = 0; j {
Summa = Summa + Korel_Buffer[i+j];
}
Srednyaya[ i ] = Summa/j;
}
}
return(rates_total);
}

Изменено пользователем Volkodrak
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Уважаемые программисты! Как вытянуть числовые значения силы валют (как на скрине) из индикатора CurrencyPowerMeter 2?
Пробовал через iCustom, не получается.
Индикатор во вложении.
Заранее благодарю.

CurrencyPowerMeter_2.mq4
2016-10-29_145406.jpg

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано



Павел, а можно попросить вас с Сергеем сделать полный курс по ООП в MQL4. Пусть даже он будет платным, зато Сергей рассказывает все просто и понятно!!! Очень интересная тема, совсем по другому начал смотреть на программирование. По моему еще рано списывать MQL4. Хотя, потихоньку, по вашим урокам изучаем MQL5. Большое спасибо вам Павел, Сергею и всей команде за ваш труд!!!

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Павел, а можно попросить вас с Сергеем сделать полный курс по ООП в MQL4. Пусть даже он будет платным, зато Сергей рассказывает все просто и понятно!!! Очень интересная тема, совсем по другому начал смотреть на прогриммироание. По моему еще рано списывать MQL4. Хотя, потихоньку, по вашим урокам изучаем MQL5. Большое спасибо вам Павел, Сергею и всей команде за ваш труд!!!


А можно конкретнее, что бы вам хотелось узнать ?
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Мне понравилось как строится сама структура программы, ее проще потом читать. Очень хочу сделать хороший советник на индикаторе Ишимоку, по всем правилам стратегии, а там как раз много данных используется, условия торговли в облаке. Интересует модификация ордеров, подтягивание их за ценой, различные трейлинг-стопы, главное - закрытие убыточных ордеров прибыльными (встречными) именно программой.
Также, многие сейчас пытаются писать советники по Price Action, как в программе сделать сравнение свечей, групп свечей, как научить искать паттерны?!
Возможно Сергей еще что-то знает интересное в ООП, что мы новички еще даже не догадываемся!!!

Изменено пользователем Playbo$$
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Уважаемые программисты! Как вытянуть числовые значения силы валют (как на скрине) из индикатора CurrencyPowerMeter 2?
Пробовал через iCustom, не получается.
Индикатор во вложении.
Заранее благодарю.



Добрый день!
Индикатор CurrencyPowerMeter 2 подправил, пример получения данных в советнике Simple.

Удачных торгов!

EURUSDM1.png
CurrencyPowerMeter_2.mq4
Simple.mq4

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Добрый день. Пытался скомпоновать индикатор для показа свечей определенной величины, но не сложилось. Будьте добры, подправьте. Спасибо!

Спойлер

//+------------------------------------------------------------------+
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property version "1.0"
#property strict
#property indicator_chart_window

input int TextSize = 8; //размер шрифта
input color TextColor = clrBlueViolet; //цвет текста
input int TextAngle = 90; //угол поворота текста
input int MaxBar = 100; //количество баров, начиная с 0, для которых вычисляется размер свечей
extern int Candle_size = 5;
double HL;
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}

int OnCalculate (const int rates_total, // размер входных таймсерий
const int prev_calculated, // обработано баров на предыдущем вызове
const datetime &time[], // Time
const double &open[], // Open
const double &high[], // High
const double &low[], // Low
const double &close[], // Close
const long &tick_volume[], // Tick Volume
const long &volume[], // Real Volume
const int &spread[]) // Spread
{
int i;
for ( i = 0; i
HL = MathAbs(High-Low); //1//фильтр по величине свечи
if ( HL>=Candle_size) //2// !!!! если эти две строки убрать то индикатор работает

{
if ( ObjectFind ("candlesize"+ IntegerToString(i)) >=0 ) {
ObjectDelete("candlesize"+ IntegerToString(i));
}


ObjectCreate ("candlesize"+ IntegerToString(i),
OBJ_TEXT,
0,
time,
high+StepPer()*Point);
ObjectSet ( "candlesize"+IntegerToString(i),
OBJPROP_ANGLE,
TextAngle
);
ObjectSetText ( "candlesize"+IntegerToString(i),
DoubleToStr(NormalizeDouble((High-Low+Point)/Point, 0), 0),
TextSize,
NULL,
TextColor
);

}
return(rates_total);
}

int StepPer ()
{
int i = 0;
switch (Period())
{
case PERIOD_M1:
i = 5;
break;
case PERIOD_M5:
i = 15;
break;
case PERIOD_M15:
i = 25;
break;
case PERIOD_M30:
i = 40;
break;
case PERIOD_H1:
i = 60;
break;
case PERIOD_H4:
i = 90;
break;
case PERIOD_D1:
i = 220;
break;
case PERIOD_W1:
i = 500;
break;
case PERIOD_MN1:
i = 2000;
break;
default:
break;
}
return (i);
}
//+------------------------------------------------------------------+




Добавлено: 02-11-2016 09:57:38

по какой-то причине, под спойлером, величины High Low оказались без квадратных скобочек, но в оригинале они присутствуют

CanSize_4.mq4

Изменено пользователем Дмитрий_2008
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Уважаемые программисты не мог бы кто помочь, есть код с таким условием (hb-начало торговли, he-конец торговли):
if (h == false || (h == true && Hour() >= hb && Hour() = hb || Hour() he)) ,
мне бы хотелось ввести минуты я попробовал вот так:
if (h == false || (h == true && Hour() >= hb && Hour() = hb || Hour() he) || (Hour() == hb && Minute() >= mb && Hour() hb) || (Hour() == hb && Hour() == he && Minute() >= mb && Minute() но что то не получается.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Уважаемые программисты не мог бы кто помочь, есть код с таким условием (hb-начало торговли, he-конец торговли):
if (h == false || (h == true && Hour() >= hb && Hour() = hb || Hour() he)) ,
мне бы хотелось ввести минуты я попробовал вот так:
if (h == false || (h == true && Hour() >= hb && Hour() = hb || Hour() he) || (Hour() == hb && Minute() >= mb && Hour() hb) || (Hour() == hb && Hour() == he && Minute() >= mb && Minute() но что то не получается.



есть решение проще. представь часы+минуты как дабловое число, где целая часть = часы, дробная часть = минуты.
например:
// время начала
double timeBegin = tmBegin;

//текущее время
double timeNow = (double)Hour()+(double)Minute()/100;

// время конца
double timeEnd= tmEnd;

где tmBegin и tmEnd - внешние дабловые перменные(например 6.00, что означает начало торгов в 6 часов 00 минут, или 20.30, что означает 20 часов 30 минут).
ну их и сравниваешь с timeNow.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Здрасти!
Может кто подсказать как прописать при пересечение машек запомнить бар и потом при повторном сигнале найти макс и мин в этом интервале вроде как дожно быть так но самневаюсь
//...
static datetime timeWork;
//...
/...
timeWork = TimeCurrent();
//...
//...
double PriceMin, PriceMax;
int BarLast = iBarShift(Symbol(),0, timeWork); //определяем бар из истории от текущего момента до момента ппоследней обработки данных
if (BarLast>0) //-- Если с момента последней обработки прошло 1 бар и более
{
PriceMin = Low[ArrayMinimum(Low,BarLast)]; //нахождение минимума
PriceMax = High[ArrayMaximum(High,BarLast)]; //нахождение максимума
}
else //-- Если с момента последней обработки мы все еще находимся на текущем баре
{
PriceMin = Low[0]; //минимум - минимум текущего бара
PriceMax = High[0]; //максимум - максимум текущего бара
}

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Здравствуйте. Подскажите, пожалуйста, возможно ли написать советник, чтобы он открывал и закрывал ордера (вел торговлю) по командам с со стороннего сервера? И если да, то как это реализовать?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Здравствуйте уважаемые трейдеры. У меня вопрос по 19 уроку MQL "Как написать сеточный советник для Metatrader 4" (обновленный урок 16.04.16). Я по данному уроку написал сеточный советник, однако он работает не полностью, а лишь открывает сделки на продажу. Отлижки на покупку в журнале отсутствуют. Скажите в чем ошибка моего советника? Буду благодарен за любую помощь!

_.mq4
_.ex4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Здравствуйте. Подскажите, пожалуйста, возможно ли написать советник, чтобы он открывал и закрывал ордера (вел торговлю) по командам с со стороннего сервера? И если да, то как это реализовать?


Добрый день!
Я попробую сделать такой советник, о результатах сообщу.


Добавлено: 05-11-2016 06:55:25


Здравствуйте уважаемые трейдеры. У меня вопрос по 19 уроку MQL "Как написать сеточный советник для Metatrader 4" (обновленный урок 16.04.16). Я по данному уроку написал сеточный советник, однако он работает не полностью, а лишь открывает сделки на продажу. Отлижки на покупку в журнале отсутствуют. Скажите в чем ошибка моего советника? Буду благодарен за любую помощь!


Поправил код, граали на уроках тихонько делаете :))

3.mq4
33333.png

Изменено пользователем SilverKZ
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...