[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 182
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Как можно заказать советник
Почему так?
Советник обрабатывает каждый тик, и на каждом тике идет проверка и открытие ордера.... нужно запоминаться время последней открытой позиции и делать паузу в 15 минут, либо работать по открытию или закрытию бара. В коде лучше привязываться ко времени бара.
Как можно заказать советник
что то в таком роде...
Плохой пример. Так как цена открытия у свечей может повторяться. А вот время нет.
Согласен:)))
Пробую освоить мкл4 и написать советник для тестов. Возникли такие вопросы.
1) Существует ли процедура проверки анализируемой истории на предмет пропусков минутных свечек по той и\или иной паре? Может быть процедура уже написана и доступна в сети?
2) Если есть пропуски или истории просто мало, как из советника закачать минутные свечки по той и\или иной паре целиком с необходимой даты или разрывы заполнить?
Идея в том, чтобы советник во время работы прверял корректность истории и в случае необходимости корректировал пропуски или малое число баров.Я изучаю язык программирования, и уперся в непонятное поведение программы. Написал советник по мотивам учебника, но переиначил, на немного другой принцип действия.
Советник на основе 2 мувинг аверендж. Затея простая, мувинги пересекаются, ордер закрывается, а противоположный открывается. Написал советник, он работает нормально. В небольшой минус конечно, но в соответствии с идеей. Вся затыка в следующем(выделил жирным):
A=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,1); // A
B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1); // B
C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // C
D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2); // D
Стоит мне поменять способ вычисления скользящих средних(может плюс покажет), и вместо простого ( MODE_SMA) поставить экспоненциальный (MODE_EMA), а также еще один(MODE_SMMA),так называемый сглаженный метод, все сразу становится наперекосяк. Принцип работы становится забавным(на тестере стратегий), советник открывает ордер в самом начале заданного периода времени, и закрывает в конце. Т.е. за год он открывает одну единственную сделку в начале периода, и закрывает в конце. В результате советник мне показал плюс, но такой плюс мне не нужен. Я и сам могу подкинуть монетку и открыть ордер либо бай либо селл, и через год посмотреть, в плюсе буду или в минусе. Кстати если вместо MODE_SMA поставить MODE_LWMA (Линейно-взвешенное скользящее среднее), программа работает нормально.
Подскажите пожалуйста, что не так? Ведь принцип тот же, просто немного изменен способ вычисления скользящих средних.
Вот весь код программы:
//+------------------------------------------------------------------+
//| На основе двух мувингов.mq4 |
//| Copyright © 2011, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
//--------------------------------------------------------------- 1 --
// Численные значения для М15
extern int Period_MA_1=6; // Период МА 1
extern int Period_MA_2=15; // Период МА 2
extern double Lots =0.1; // Жестко заданное колич. лотов
bool Work=true; // Эксперт будет работать.
string Symb; // Название финанс. инструмента
//--------------------------------------------------------------- 2 --
int start()
{
int
Total, // Количество ордеров в окне
Tip=-1, // Тип выбран. ордера (B=0,S=1)
Ticket; // Номер ордера
double
A, // Значен. МА_1 для первого бара с конца
B, // Значен. МА_2 для первого бара с конца
Price, // Цена выбранного ордера
C, // Значен. МА_1 для второго бара с конца
D, // Значен. МА_2 для второго бара с конца
Lot; // Колич. лотов в выбран.ордере
bool
Ans =false, // Ответ сервера после закрытия
Cls_B=false, // Критерий для закрытия Buy
Cls_S=false, // Критерий для закрытия Sell
Opn_B=false, // Критерий для открытия Buy
Opn_S=false; // Критерий для открытия Sell
//--------------------------------------------------------------- 3 --
// Предварит.обработка
if(Bars < Period_MA_2) // Недостаточно баров
{
Alert("Недостаточно баров в окне. Эксперт не работает.");
return; // Выход из start()
}
if(Work==false) // Критическая ошибка
{
Alert("Критическая ошибка. Эксперт не работает.");
return; // Выход из start()
}
//--------------------------------------------------------------- 4 --
// Учёт ордеров
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; // Выход из start()
}
Total++; // Счётчик рыночн. орд
if (Total>1) // Не более одного орд
{
Alert("Несколько рыночных ордеров. Эксперт не работает.");
return; // Выход из start()
}
Ticket=OrderTicket(); // Номер выбранн. орд.
Tip =OrderType(); // Тип выбранного орд.
Price =OrderOpenPrice(); // Цена выбранн. орд.
Lot =OrderLots(); // Количество лотов
}
}
//--------------------------------------------------------------- 5 --
// Торговые критерии
A=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,1); // A
B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1); // B
C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // C
D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2); // D
if (A<C&&C>D&&B>=A) // Линия МА1 идет сверху вниз,
{ // МА1 пересекает МА2
Opn_B=true; // сверху вниз
Cls_S=true; //
}
if (B<D&&D>C&&A>=B) // Линия МА2 идет сверху вниз
{ // МА2 пересекает МА1
Opn_S=true; // сверху вниз
Cls_B=true; //
}
//--------------------------------------------------------------- 6 --
// Закрытие ордеров
while(true) // Цикл закрытия орд.
{
if (Tip==0 && Cls_B==true) // Открыт ордер Buy..
{ //и есть критерий закр
Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа..");
RefreshRates(); // Обновление данных
Ans=OrderClose(Ticket,Lot,Bid,2); // Закрытие Buy
if (Ans==true) // Получилось :)
{
Alert ("Закрыт ордер Buy ",Ticket);
break; // Выход из цикла закр
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
if (Tip==1 && Cls_S==true) // Открыт ордер Sell..
{ // и есть критерий закр
Alert("Попытка закрыть Sell ",Ticket,". Ожидание ответа..");
RefreshRates(); // Обновление данных
Ans=OrderClose(Ticket,Lot,Ask,2); // Закрытие Sell
if (Ans==true) // Получилось :)
{
Alert ("Закрыт ордер Sell ",Ticket);
break; // Выход из цикла закр
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
break; // Выход из while
}
//--------------------------------------------------------------- 7 --
//--------------------------------------------------------------- 8 --
// Открытие ордеров
while(true) // Цикл закрытия орд.
{
if (Total==0 && Opn_B==true) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данных
Alert("Попытка открыть Buy. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_BUY,Lots,Ask,20,0,0,"советник 2хМА");//Открытие Buy
if (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Buy ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
if (Total==0 && Opn_S==true) // Открытых орд. нет +
{ // критерий откр. Sell
RefreshRates(); // Обновление данных
Alert("Попытка открыть Sell. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_SELL,Lots,Bid,20,0,0,"советник 2хМА");//Открытие Sel
if (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Sell ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
return; // Выход из start()
}
break; // Выход из while
}
//--------------------------------------------------------------- 9 --
return; // Выход из start()
}
//-------------------------------------------------------------- 10 --
int Fun_Error(int Error) // Ф-ия обработ ошибок
{
switch(Error)
{ // Преодолимые ошибки
case 4: Alert("Торговый сервер занят. Пробуем ещё раз..");
Sleep(3000); // Простое решение
return(1); // Выход из функции
case 135:Alert("Цена изменилась. Пробуем ещё раз..");
RefreshRates(); // Обновим данные
return(1); // Выход из функции
case 136:Alert("Нет цен. Ждём новый тик..");
while(RefreshRates()==false) // До нового тика
Sleep(1); // Задержка в цикле
return(1); // Выход из функции
case 137:Alert("Брокер занят. Пробуем ещё раз..");
Sleep(3000); // Простое решение
return(1); // Выход из функции
case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
Sleep(500); // Простое решение
return(1); // Выход из функции
// Критические ошибки
case 2: Alert("Общая ошибка.");
return(0); // Выход из функции
case 5: Alert("Старая версия терминала.");
Work=false; // Больше не работать
return(0); // Выход из функции
case 64: Alert("Счет заблокирован.");
Work=false; // Больше не работать
return(0); // Выход из функции
case 133:Alert("Торговля запрещена.");
return(0); // Выход из функции
case 134:Alert("Недостаточно денег для совершения операции.");
return(0); // Выход из функции
default: Alert("Возникла ошибка ",Error); // Другие варианты
return(0); // Выход из функции
}
}
//-------------------------------------------------------------- 11 --
Я изучаю язык программирования, и уперся в непонятное поведение программы. Написал советник по мотивам учебника, но переиначил, на немного другой принцип действия.
при закрытии ордера неплохо бы уменьшать Total, а лучше не парить мозг и сделать функцию которая возвращает количество открытых ордеров по символу и магику.
Четыре скользящих средних это перебор и смысл в двух периодах и с разным смещением. Рекомендуется вывести их на экран и посмотреть как они себя ведут.