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

От xbms, 13 апреля, 2013 в Уголок Программиста

#3326

анкт' - необъявленный идентификатор test3.mq4 и 84 13
ST=NormalizeDouble(Ask-StopLoss*Point,Digits); и на той же строке
возможная потеря данных из-за преобразования типов test3.mq4
подскажите как исправить

extern string TMA="Параметры";
extern int TakeProfit =100;
extern int StopLoss =50;
extern int Megic = 123;
extern double Lots = 0.01;
extern int Slippage =5;
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern int Price = PRICE_CLOSE;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;

double PriceHigh,PriceLow,SL,TP;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{

if(Digits==3 || Digits==5)
{

TakeProfit*=10;
StopLoss*=10;
Slippage*=10;
}

return(INIT_SUCCEEDED);

}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+

//---

//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
PriceHigh=iCustom(NULL,0,"TMA_Fair",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,1,0);
PriceLow=iCustom(NULL,0,"TMA_Fair",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,2,0);

if(CountBuy()==0 && Ask
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"tma",Megic,0,Blue);
if(ticket>0)
{
TP=NormalizeDouble(Ask+TakeProfit*Point,Digits);
ST=NormalizeDouble(Ask-StopLoss*Point,Digits);

if(OrderSelect(ticket,SELECT_BY_TICKET))

if( OrderModify(ticket,OrderOpenPrice(),ST,TP,0))
Print("Ошибка");
}

}

if(CountSell()==0 && Bid>=PriceHigh)

{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"tma",Megic,0,Red);
if(ticket>0)
{
ST=NormalizeDouble(Bid+StopLoss*Point,Digits);
TP=NormalizeDouble(Bid-TakeProfit*Point,Digits);

if(OrderSelect(ticket,SELECT_BY_TICKET))

if( OrderModify(ticket,OrderOpenPrice(),ST,TP,0))
Print("Ошибка");
}
}
}
//+------------------------------------------------------------------+
int CountSell()
{
int count=0;
for(int trede=OrdersTotal()-1;trede>=0;trede--)
{
if(OrderSelect(trede,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Megic && OrderType()==OP_SELL)

count++;

}
}
return(count);
}

int CountBuy()
{
int count=0;
for(int trede=OrdersTotal()-1;trede>=0;trede--)
{
if(OrderSelect(trede,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Megic && OrderType()==OP_BUY)

count++;

}
}

return(count);
}
//+------------------------------------------------------------------+

#3327

Уважаемы Сергей aka XBMS!

Появилась идея для одного из уроков.

Иногда сталкиваешься с задачей построения индикатора данные для которого хранятся в файле CSV (либо любом другом табличном документе). Формат данных в файле два одномерных массива один из которых дата, другой - значение индикатора.

Могли бы Вы, опираясь на Ваш опыт программирования, помочь нам - рядовым трейдерам разобраться в этой теме.

Расскажите нам как выгружать автоматом файлы с сайтов (знаю это делается на VBA, в MQL функций не нашел), извлекать данные, и строить непосредственно сам индикатор, т.к. уроков на которых рассматривалось бы построение индикатора от Вас нет.

Советник по индикатору мы уже умеем делать.

Буду Вам очень признателен, да и не только я, как мне кажется, если уделите данному вопросу немного Вашего внимания.

Изменено 28 марта, 2016 пользователем deathmurder

#3328

Подскажите пожалуйста, как при помощи функции iStochastic запретить покупать выше уровня 80 и продавать ниже уровня 20? Как вообще обозначить эти уровни? Справка F1 ответов не дает.

#3329


Подскажите пожалуйста, как при помощи функции iStochastic запретить покупать выше уровня 80 и продавать ниже уровня 20? Как вообще обозначить эти уровни? Справка F1 ответов не дает.

У индикатора есть буфер. в нём значения ( для стоха от 0 до 100 ). Вы эти значения считываете в советнике на каждом баре и принимаете решение покупать или нет, а вот когда принимаете решение там и сравниваете полученное значение с уровнями. например: if ( stoh1 >= 80 && stoh2
#3330

У меня такой вопрос, существуют ли библиотеки длинной арифметики в mql (т.е. числа > 64 бит. Например 512 и т.п.) или надо думать как самому реализовать?

П.С. вопрос чисто познавательный

#3331

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

#3332


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


Вот держите, на закрытие и модификацию аналогично
// if(/* Сигнал на открытие ордреа*/)
if(MessageBox("Подтвердите открытие позиции","Открытие ордера по "+Symbol(),MB_YESNO)==IDYES)
{
// "Открываем ордер если нажата Yes"
}
else
if(MessageBox("Подтвердите открытие позиции","Открытие ордера по "+Symbol(),MB_YESNO)==IDNO)
{
Print("Пользователь отказался от открытия позиции");
}
#3333

Думаю что лучше будет так:
int res = MessageBox("Подтвердите открытие позиции","Открытие ордера по "+_Symbol,MB_YESNO);
if ( res == IDYES ) { Подтверждено(); }
else if ( res == IDNO ) { НЕподтверждено(); }

Изменено 29 марта, 2016 пользователем 0ll

#3334

Здравствуйте г. трейдеры и программисты!
Человеку свойственно ошибаться и хорошо если есть возможность и желание свои ошибки находить,призновать и помогать исправлять.
Для этого я создал эту тему,где мы могли попросить опытных программистов помочь в решении рабочих проблем индикаторов,скриптов и советников.

Начал я обучатся пошаговым видеокурсом «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт» и стал я писать свой первый советник.

Я взял самую простую стратегию из двух скользящих и что то так написал что советник иногда невыставляет ТейкПрофит и открывает сделки как то очень быстро на каждом тике даже недумая.
Хочу понять где моя ошибка..
При компеляции ошибок нету и незнаю где искть..
Если у кого найдется время и желание-взгляните пожалута и помогите справитя с ошибками..

extern double Lots = 0.1;
extern int TakeProfit = 150;
extern int StopLoss =50;
extern int SMA_1 =13;
extern int Shift1 =1;
extern int SMA_2 =70;
extern int Shift2 =1;
extern int Slippage =3;
extern int Magic =123;


int ticket;
double TP,SL;
bool a = true;
bool b = false;
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits ==3 || Digits == 5)
{
TakeProfit *=10;
StopLoss *=10;
Slippage *=10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
void OnTick()
{
double ima =iMA(Symbol(),PERIOD_H4,SMA_1,Shift1,MODE_SMA,PRICE_CLOSE,0);
double iima =iMA(Symbol(),PERIOD_H4,SMA_2,Shift2,MODE_SMA,PRICE_CLOSE,0);
if (CountTrades()==b)
{
if (((Ask>ima)>(Ask>iima))==a)
{
TP = NormalizeDouble(Ask+TakeProfit*Point,Digits);
SL = NormalizeDouble(Ask-StopLoss*Point,Digits);
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP,"SR",Magic,0,Blue);
}
else
{
if (((Bid TP = NormalizeDouble(Bid-TakeProfit*Point,Digits);
SL = NormalizeDouble(Bid+StopLoss*Point,Digits);
ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,"SR",Magic,0,Red);
}
}
}
//+------------------------------------------------------------------+
int CountTrades ()
{
int count =0;
for (int i=OrdersTotal()-1; i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic)
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
count++;
}
}
return(count);
}

TEST6.mq46 скач.

#3335
rav основная ошибка здесь:
if (((Ask>ima)>(Ask>iima))==a) и if (((BidВы похоже не поняли что написали. Хотя-бы словами описали условия на вход, а то не знаю что посоветовать...
Подозреваю, что вход по пересечению средних. Для этого нужно значения средних на 1 и 2 баре, примерно так:
дабл мафаст1=0, маслоу1=0, мафаст2 = мафаст1, маслоу2 = маслоу1;
дабл мафаст1 = има(.фаст..)
дабл маслоу1 = има(.слоу..)
иф ( мафаст2 == 0 или маслоу2 ==0 ) выход

условие на вход: иф ( мафаст1 > маслоу1 && мафаст2 извини, что на русском - думаю разберёшься.
#3336

Спасибо 0ll !
Суть стратегии проста:
1) Если цена Ask > SMA 70 то рассматриваем только Buy.

2) Если цена Bid
3) Когда SMA 13 пересекла SMA70 с низу вверх и Ask>SMA13 то делаем покупку на Buy.

4) Когда SMA 13 пересекла SMA 70 с верху вниз и Bid
5) Если цена находится где то по середине и нету чёткого сигнала на Buy или Sell то неделаем нечего = False.

#3337

Тогда так:
иф ( мафаст1 > маслоу1 && мафаст2 мафаст1 ) опен ( Бай )
но я думаю последнее условие лишнее, ибо когда быстрая ма идёт вверх, то она отстаёт от цены...

#3338

Непонимаю почему он делает покупки Buy там где надо делать продажи Sell или не делать нечего...

scrin_test6.png

#3339

код файлом прикрепи

#3340

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

void OnTick()
{
double ima =iMA(Symbol(),0,SMA_1,Shift1,MODE_SMA,PRICE_CLOSE,0);
double iima =iMA(Symbol(),0,SMA_2,Shift2,MODE_SMA,PRICE_CLOSE,0);
if (CountTrades()==b)
{
if (((Ask>ima)&&(ima>iima))==a)
{
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"SR",Magic,0,Blue);
}
else
{
if (((Bid ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"SR",Magic,0,Red);
}
}
ORDER_MODIFY();
}

skrin-test6-2.png

#3341

Вы логику проверьте, я же дал решение, если оно Вас не устраивает, то у меня другого нет - Вам придется самому.

#3342

Спасибо Вам за советы и своё время..
Советник на тестере работает отлчно..,как и предусматривается по ТС
С профитом конечно пока слабовато.. много лосей.. но я думаю если ему прикрепить время работы,безубыток и трал то будет на много лучще.. :)

#3343

1.В тестере когда начинаешь тестировать советник визуальный график стоит по умолчанию, он очень неудобный, и приходится включать необходимый шаблон. А можно ли встройть в код вызов нужного шаблона, чтобы не делать лишние ненужные действия.
_________________________________________________________________
2.цикл for используется только если нужно что то перебрать, найти нужное значение или его можно использовать постоянно. Хотел перебрав бары в историй наити материнскую свечу, и уже найдя его и сохранив значения, выйти из цикла, но заметил что он работает прекрасно дальше.---------------------Можно ли цикл for использовать постоянно или не желательно! ----------->
всетаки не желательно, на демо постоянно перебирает. у меня линий дергаются на каждом тике начиная перебор каждый раз все заново.
__________________________________________________________________
3. При обрыве связи с терминалом управление передается функций OnDeinit, а при соединений функций int OnInit() и дальше в void OnTick() Все правильно??

Изменено 30 марта, 2016 пользователем vitek01

#3344


1.В тестере когда начинаешь тестировать советник визуальный график стоит по умолчанию, он очень неудобный, и приходится включать необходимый шаблон. А можно ли встройть в код вызов нужного шаблона, чтобы не делать лишние ненужные действия.
_________________________________________________________________
2.цикл for используется только если нужно что то перебрать, найти нужное значение или его можно использовать постоянно. Хотел перебрав бары в историй наити материнскую свечу, и уже найдя его и сохранив значения, выйти из цикла, но заметил что он работает прекрасно дальше.---------------------Можно ли цикл for использовать постоянно или не желательно! ----------->
всетаки не желательно, на демо постоянно перебирает. у меня линий дергаются на каждом тике начиная перебор каждый раз все заново.



1 Назовите шаблон именем советника, тогда при старте тестера будет подгружаться шаблон с таким же именем как и имя у советника.
2 Циклы нужно использовать по необходимости, и весьма экономно. Циклы могут сильно тормозить советника. По этому их использование должно быть максимально продуманным.
#3345



1.В тестере когда начинаешь тестировать советник визуальный график стоит по умолчанию, он очень неудобный, и приходится включать необходимый шаблон. А можно ли встройть в код вызов нужного шаблона, чтобы не делать лишние ненужные действия.
_________________________________________________________________
2.цикл for используется только если нужно что то перебрать, найти нужное значение или его можно использовать постоянно. Хотел перебрав бары в историй наити материнскую свечу, и уже найдя его и сохранив значения, выйти из цикла, но заметил что он работает прекрасно дальше.---------------------Можно ли цикл for использовать постоянно или не желательно! ----------->
всетаки не желательно, на демо постоянно перебирает. у меня линий дергаются на каждом тике начиная перебор каждый раз все заново.



1 Назовите шаблон именем советника, тогда при старте тестера будет подгружаться шаблон с таким же именем как и имя у советника.
2 Циклы нужно использовать по необходимости, и весьма экономно. Циклы могут сильно тормозить советника. По этому их использование должно быть максимально продуманным.

Спасибо большое! а 3 пункт вопроса не прокоментируете!
#3346




1.В тестере когда начинаешь тестировать советник визуальный график стоит по умолчанию, он очень неудобный, и приходится включать необходимый шаблон. А можно ли встройть в код вызов нужного шаблона, чтобы не делать лишние ненужные действия.
_________________________________________________________________
2.цикл for используется только если нужно что то перебрать, найти нужное значение или его можно использовать постоянно. Хотел перебрав бары в историй наити материнскую свечу, и уже найдя его и сохранив значения, выйти из цикла, но заметил что он работает прекрасно дальше.---------------------Можно ли цикл for использовать постоянно или не желательно! ----------->
всетаки не желательно, на демо постоянно перебирает. у меня линий дергаются на каждом тике начиная перебор каждый раз все заново.



1 Назовите шаблон именем советника, тогда при старте тестера будет подгружаться шаблон с таким же именем как и имя у советника.
2 Циклы нужно использовать по необходимости, и весьма экономно. Циклы могут сильно тормозить советника. По этому их использование должно быть максимально продуманным.

Спасибо большое! а 3 пункт вопроса не прокоментируете!

Нет, при обрыве связи советник просто замирает, при возобновлении связи продолжает свою работу.
онинит вызывается в момент присоединения советника к графику, не зависимо от наличия связи.
деинит вызывается в момент удаления советника с графика, не зависимо от наличия связи.
#3347

Всем привет. Задавал недавно вопрос по поводу подтверждения открытия/закрытия позиции советником, советовали MessageBox, но так ладу и не дал, не понял как это работает и как происходит обработка открытия
закрытия, понял только, что MessageBox вызывает бокс с сообщением, а что в кавычках? Помогите, господа, нерадивому студенту) прикрепляю бесплатный открытый советник. Можете показать на его примере, как это будет работать, где и как там будет располагаться эта функция. Спасибо.

stochastic-automated.mq415 скач.

#3348


Всем привет. Задавал недавно вопрос по поводу подтверждения открытия/закрытия позиции советником, советовали MessageBox, но так ладу и не дал, не понял как это работает и как происходит обработка открытия
закрытия, понял только, что MessageBox вызывает бокс с сообщением, а что в кавычках? Помогите, господа, нерадивому студенту) прикрепляю бесплатный открытый советник. Можете показать на его примере, как это будет работать, где и как там будет располагаться эта функция. Спасибо.


Сделал один пример..

stochastic-automated.mq416 скач.

#3349

Компиляция ошибок и предупреждений не выдала..,на тестере работает всё чётка . А на ECN счёте неработает..просто молчит и всё.. Что делатьнепонимаю... Помогите пожалуста! :)

Dzintars.mq49 скач.

#3350

Советник нарисовал линий на хай и лоу свечи, но вот при смене таймфрейма линий сбрасываются.... Что пройсходит при смене таймфрейма и как зделать так чтобы линий были устойчивы к таким переключениям???

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

Перейти к списку тем
Форум · 2.0.20260627.0025