[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 182

 
 
dent:
Как можно заказать советник
Тут можно заказать: https://www.mql5.com/ru/job
 
NaVolne:


Почему так?

Советник обрабатывает каждый тик, и на каждом тике идет проверка и открытие ордера.... нужно запоминаться время последней открытой позиции и делать паузу в 15 минут, либо работать по открытию или закрытию бара. В коде лучше привязываться ко времени бара.

double OpenBar=0; 
 
int start()
   {
    //Проверка на начало нового бара
    if (OpenBar==Time[0]) {return;} else {OpenBar=Time[0];}
    //ваш код
   }
 
dent:
Как можно заказать советник
 
OlegTs:
double OpenBar=0; 

 

int start()
   {
    //Проверка на начало нового бара
    double CurOpenBar=iOpen(NULL,PERIOD_M15,0);  
    if (OpenBar==CurOpenBar) {return;} else {OpenBar=CurOpenBar;}
    //ваш код
   }


что то в таком роде...

Плохой пример. Так как цена открытия у свечей может повторяться. А вот время нет.
 
MaxZ:
Плохой пример. Так как цена открытия у свечей может повторяться. А вот время нет.

Согласен:)))
 
Ребята, Спасибо большое, потихоньку начинает что-то получаться :)
 

Пробую освоить мкл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 --



 
neisseria:

Я изучаю язык программирования, и уперся в непонятное поведение программы. Написал советник по мотивам учебника, но переиначил, на немного другой принцип действия.



при закрытии ордера неплохо бы уменьшать Total, а лучше не парить мозг и сделать функцию которая возвращает количество открытых ордеров по символу и магику.

Четыре скользящих средних это перебор и смысл в двух периодах и с разным смещением. Рекомендуется вывести их на экран и посмотреть как они себя ведут.

Причина обращения: