Allis Amazing
Интересующийся
А я сейчас, ну в течение дня проверю и напишу. Спасибки бОльшее!!!
//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPeriod, double& prevMA)
{
prevMA = iMA(NULL, i_trading_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 1);
return (iMA(NULL, i_trading_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой |
//+-------------------------------------------------------------------------------------+
void GetStateMa(int& signal[])
{
double ema365_1;
double ema365_0 = GetCurAndPrevMA(365, ema365_1);
for (int i = 0; i < 4; i++)
{
double ema1;
double ema0 = GetCurAndPrevMA(g_maPeriod[i], ema1);
signal[i] = MA_TALKING_FLAT;
if (ema1 < ema365_1 && ema0 > ema365_0)
signal[i] = MA_TALKING_LONG;
if (ema1 > ema365_1 && ema0 < ema365_0)
signal[i] = MA_TALKING_SHORT;
}
}
//+-------------------------------------------------------------------------------------+
//| Имеет ли место отскок? |
//+-------------------------------------------------------------------------------------+
bool IsRebound(int& signal[])
{
double low = iLow(Symbol(), i_trading_TF, 1);
double high = iHigh(Symbol(), i_trading_TF, 1);
// Получаем 2 соседних значения ema6
for(int i=0; i<4; i++)
{
double ema1;
double ema0 = GetCurAndPrevMA(g_maPeriod[i],ema1);
RefreshRates();
if (GetStateMa(signal[i]) == MA_TALKING_LONG)
{
if (ema1 < low)
if (ema0 >= Bid)
return (true);
}
if (GetStateMa(signal[i]) == MA_TALKING_SHORT)
{
if (ema1 > high)
if (ema0 <= Ask)
return (true);
}
}
return (false);
}
//+-------------------------------------------------------------------------------------+
//| Получение общего сигнала на вход |
//+-------------------------------------------------------------------------------------+
void GetGeneralSignal(int& signal[])
{
for(int i=0; i<4; i++)
{
signal[i] = SIGNAL_NO;
if(GetStateMa(signal[i]) == MA_TALKING_LONG && IsRebound(signal[i]) == true)
signal[i] = SIGNAL_BUY;
if(GetStateMa(signal[i]) == MA_TALKING_SHORT && IsRebound(signal[i]) == true)
signal[i] = SIGNAL_SELL;
}
}
//+-------------------------------------------------------------------------------------+
//| Функция start |
//+-------------------------------------------------------------------------------------+
int start()
{
static datetime barTime = 0;
if (barTime == iTime(NULL, i_trading_TF, 0))
return (0);
int signal[4];
GetStateMa(signal);
GetGeneralSignal(signal);
if (!Trade(signal))
return (0);
barTime = iTime(NULL, i_trading_TF, 0);
return (0);
}
'signal' - incompatible types E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (126, 21)
'signal' - incompatible types E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (132, 21)
'signal' - incompatible types E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (151, 19)
'signal' - incompatible types E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (151, 62)
'signal' - incompatible types E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (154, 19)
'signal' - incompatible types E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (154, 63)
if (GetStateMa(signal[i]) == MA_TALKING_LONG)
if (GetStateMa(signal[i]) == MA_TALKING_SHORT)
А я сейчас, ну в течение дня проверю и напишу. Спасибки бОльшее!!!
На дёмке пока пашет, но и ситуации не было подходящей, а тестер аж завис от ошибок, файл скомпилировался нормально...
Код:bool CheckTimeFors() { [COLOR="Red"]return(false);[/COLOR] Благодарствую что не оставили без внимания! Вот в сюда? [/QUOTE] Уес. Но вам правильно пишут, что надо функцию построчно разобрать, может кроме проверки условия она делает что-то ещё - меняет какие-то значения в глобальных переменных, а они влияют на работу др функций [QUOTE="hoz, post: 560128, member: 46136"] [PHP]if (GetStateMa(signal[i]) ... void GetStateMa(int& signal[]) [/PHP][/QUOTE] В if функции передается единственное значение массива нумер i, т.е. переменная а не массив, как требует GetStateMa(int& signal[])
В if функции передается единственное значение массива нумер i, т.е. переменная а не массив, как требует GetStateMa(int& signal[])
for(int i=0; i<4; i++)
Если ты не знаешь алгоритм своей совы, то почему ты так в него упёрлась? Я, например, недоверяю левым разработкам, если не в курсе про алгоритм той или иной совы..
Наверняка там всё просто. Но смена какого то условия не всегда приводит к правильным результатам. Есть 3 варианта действий.И всё-таки поменяв все 12 на -1 и 48 на 60 Сова все равно посчитала что время пришло и сменила СЛ у открытых ордеров..... Я близка к помешательству.... Значит даже если время настать не может(!) всё равно алгоритм силён и делает свою работу)))
Программист был настолько силён, что видимо учёл и форс-мажор для форс-мажора....
Так у меня ж там цикл:
PHP:for(int i=0; i<4; i++)
Для каждого i идёт проверка условия, то для каждого индекса (для каждой машки)
Поэтому я и сравниваю по каждому индексу отдельно, как же иначе?
hoz, ты сказал, что изучаешь массивы, а массивы не объявлены. Какое-же может быть изучение если ты даже не прочёл о том как массивы объявляются...Неужели такой сложный вопрос, что никто не знает ответ? Здесь идёт обсуждение кода, который полностью никто не видит, и даже, нет канкретной картины его алгоритма.
Я же описал задачу явно, и это вроде как можно понять, если, конечно, кто-то понимает как это делается.
hoz, ты сказал, что изучаешь массивы, а массивы не объявлены. Какое-же может быть изучение если ты даже не прочёл о том как массивы объявляются...
int g_maPeriod[4] = {6, 25, 150, 250}, // Периоды обрабатываемых МА
g_signMA[4] = {1, 2, 3, 4}; // Признаки МАшек, добавляемые в Magic
// ..Number ордера к основному Magic
int signal[4] = {1,2,3,4};
Неужели такой сложный вопрос, что никто не знает ответ? Здесь идёт обсуждение кода, который полностью никто не видит, и даже, нет канкретной картины его алгоритма.
Я же описал задачу явно, и это вроде как можно понять, если, конечно, кто-то понимает как это делается.
Отжеж божеш мой, вам жеж и терминал в журнале пишет и здесь уже написали - сделайте одиноковый тип переменной в вызове функции и в описании ее переменных. Уберите квадратные скобки в GetStateMa(int& signal[]) и жизень станет проще
void GetGeneralSignal(int& signal[])
{
for(int i=0; i<4; i++)
{
signal[i] = SIGNAL_NO;
if(GetStateMa(signal[i]) == MA_TALKING_LONG && IsRebound(signal[i]) == true)
signal[i] = SIGNAL_BUY;
if(GetStateMa(signal[i]) == MA_TALKING_SHORT && IsRebound(signal[i]) == true)
signal[i] = SIGNAL_SELL;
}
}
Наверняка там всё просто. Но смена какого то условия не всегда приводит к правильным результатам. Есть 3 варианта действий.
1. разыскать программиста, писавшего советник. Хороший вариант, но не всегда выполнимый.
2. Обратиться к другому программисту. Предоставить ему код целиком. Объяснить что нужно переделать. Не лучший вариант, но может быть самым оптимальным.
3. Выучить основы языка программирования и разобраться в коде самостоятельно. учебники и справочники есть в свободном доступе. Лучший вариант. Эти навыки лишними не будут.
int g_maPeriod[4] = {6, 25, 150, 250}, // Периоды обрабатываемых МА
g_signMA[4] = {1, 2, 3, 4}; // Признаки МАшек, добавляемые в Magic
// ..Number ордера к основному Magic
int signal[4] = {1,2,3,4}; // Сигналы на вход в рынок
int stateMA[4] = {1,2,3,4}; // Положение машек относительно друг друга
#define MA_TALKING_LONG 0 // Машки расположены к покупке
#define MA_TALKING_SHORT 1 // Машки расположены к продаже
#define MA_TALKING_FLAT -1 // Машки указывают на флет
#define SIGNAL_BUY 0 // Сигнал на покупку
#define SIGNAL_SELL 1 // Сигнал на продажу
#define SIGNAL_NO -1 // Сигнала нет
//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров |
//+-------------------------------------------------------------------------------------+
int FindOrders(int sign)
{
int t; // Количество открытых позиции (buy's + sell's)
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS))
continue;
if (OrderMagicNumber() == i_myMagic + sign &&
OrderSymbol() == Symbol())
t++;
}
return (t);
}
//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPeriod, double& prevMA)
{
prevMA = iMA(NULL, i_trading_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 1);
return (iMA(NULL, i_trading_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой |
//+-------------------------------------------------------------------------------------+
void GetStateMa(int& stateMA[])
{
double ema365_1;
double ema365_0 = GetCurAndPrevMA(365, ema365_1);
for (int i = 0; i < 4; i++)
{
double ema1;
double ema0 = GetCurAndPrevMA(g_maPeriod[i], ema1);
stateMA[i] = MA_TALKING_FLAT;
if (ema1 < ema365_1 && ema0 > ema365_0)
stateMA[i] = MA_TALKING_LONG;
if (ema1 > ema365_1 && ema0 < ema365_0)
stateMA[i] = MA_TALKING_SHORT;
}
}
//+-------------------------------------------------------------------------------------+
//| Имеет ли место отскок? |
//+-------------------------------------------------------------------------------------+
bool IsRebound(int& stateMA[])
{
double low = iLow(Symbol(), i_trading_TF, 1);
double high = iHigh(Symbol(), i_trading_TF, 1);
// Получаем 2 соседних значения ema6
for(int i=0; i<4; i++)
{
double ema1;
double ema0 = GetCurAndPrevMA(g_maPeriod[i],ema1);
RefreshRates();
if (stateMA[i] == MA_TALKING_LONG)
{
if (ema1 < low)
if (ema0 >= Bid)
return (true);
}
if (stateMA[i] == MA_TALKING_SHORT)
{
if (ema1 > high)
if (ema0 <= Ask)
return (true);
}
}
return (false);
}
//+-------------------------------------------------------------------------------------+
//| Получение общего сигнала на вход |
//+-------------------------------------------------------------------------------------+
void GetGeneralSignal(int& signal[])
{
for(int i=0; i<4; i++)
{
signal[i] = SIGNAL_NO;
if(stateMA[i] == MA_TALKING_LONG && IsRebound(stateMA[i]) == true)
signal[i] = SIGNAL_BUY;
if(stateMA[i] == MA_TALKING_SHORT && IsRebound(stateMA[i]) == true)
signal[i] = SIGNAL_SELL;
}
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинных позиций |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(int i_myMagic)
{
int ticket = -1;
string myNote = "Сов баянул";
ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,i_slippage,0,0,myNote,i_myMagic,0,Blue);
if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие коротких позиций |
//+-------------------------------------------------------------------------------------+
bool OpenSell(int i_myMagic)
{
int ticket = -1;
string myNote = "Сов шортанул";
ticket = OrderSend(Symbol(),OP_SELL,0.1,Bid,i_slippage,0,0,myNote,i_myMagic,0,Red);
if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций |
//+-------------------------------------------------------------------------------------+
bool Trade(int& signal[])
{
for (int i = 0; i < 4; i++)
{
if (stateMA[i] == MA_TALKING_LONG && FindOrders(g_signMA[i]) == 0)
if (!OpenBuy(g_signMA[i]))
return (false);
if (stateMA[i] == MA_TALKING_LONG && FindOrders(g_signMA[i]) == 0)
if (!OpenSell(g_signMA[i]))
return (false);
}
return (true);
}
int start()
{
static datetime barTime = 0;
if (barTime == iTime(NULL, i_trading_TF, 0))
return (0);
int signal[4];
int stateMA[4];
GetStateMa(signal);
GetGeneralSignal(signal);
if (!Trade(signal))
return (0);
barTime = iTime(NULL, i_trading_TF, 0);
return (0);
}
'stateMA' - incompatible types E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (152, 51)
'stateMA' - incompatible types E:\Insall'd soft's\Forex\Alpari NZ MT4\experts\Base150_2.mq4 (155, 52)
2 ошибок, 0 предупреждений
На сайте авторов есть официальный букварь. _http://book.mql4.com/ru/1-ый пункт невыполним, я бы и не мучилась даже.
2-ой не вариант, пробовала, но говорят слишком сложный алгоритм.
3-ий вот этим аккурат я сейчас и занялась, только где бы найти "доступную" азбуку, там где бы было не просто написано что бывают глобальные, а бывают переменные, а ещё и их функции на доступном языке....
На сайте авторов есть официальный букварь. _http://book.mql4.com/ru/
А вообще их много написано.
Ай, спасибо, посмотрю. Просто человек который знает тему, всегда может отличить "толковый букварь" от "ну что-то там на эту тему написано")))
Улыбнули, я с утра посмотрев на этот "учебник" уже поняла, что надо взять что-то простенькое и начать его курочить, а в "учебник" аккурат подглядывать за разъяснениями)))На самом деле учебником "это" не назовёшь. Сделано абы-как... Лучше смотри чьи-н. коды и изучай как они написано, а потом когда будет понимать как работаю эксперты, сможешь сама писать. А "то" что на оф. сайте.. используй как документацию и не более того. Документация с большего сносная, а учебника по сути нет, одно название..