paladin80: Где лучше объявлять тип переменной (int, double и т.д.) с точки зрения уменьшения затратности ресурсов исполнения программы. Напр. int i можно объявить на глобальном уровне, а можно и в int start() ... в for (int i=OrdersTotal()-1; i>=0; i--) ... У меня есть ощущение, что объявление на каждом тике затратнее, чем один раз на глобальном уровне, сразу же после extern parameters. Или же разница в ресурсоёмкости одинакова?
все равно, все переменные (место для переменной в памяти) создаются один раз при старте программы, в дальнейшем переменная должна быть проинициализированна в том месте где она встречается в тексте (объявление переменной),но это случается не всегда, так что если хотите что бы все работало как надо, не забывайте ее явно проинициализировать при объявлении. на скорость не влияет, можете хоть внутри цикла объявлять - проверено.
Код исправил в соответствии с вашим. При тестировании четыре ордера закрылись в порядке установки на первом тике, пятый - на следующем. Вероятно, здесь что-то ещё не так т.к. тестировал неоднократно. Код программы и записи из журнала тестера привожу. С уважением. Shurkin
Все ясно. Замените
for(i=0, int k=0; i<OrdersTotal();i++,k++)//
на
int total=OrdersTotal();
for(i=0, int k=0; i<total;i++,k++)//
Здравствуйте.Подскажите,как подсчитать сумму значений индикатора в каждом отдельном блоке гистограммы.Я написал индикатор,но он начинает работать только с момента его установки.На предыдущих барах - пусто! Не удаётся мне цикл "while"!Помогите,профессионалы.
//+-------------------------------------------------------------------------------------+//| Блок поиска своих объектов |//+-------------------------------------------------------------------------------------+bool IsObjectFound()
{
for (int obj=0; obj<=ObjectsTotal()-1; obj++)
{
objName = ObjectName(obj);
isObj = ObjectFind(objName);
objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
objPriceCurr = ObjectGetValueByShift(objName,0);
}
Print("objPriceCurr = ", objPriceCurr);
if (isObj != -1) // Если объект найден, значит выходим из функцииreturn (true);
return (false); // Объект не найден!
}
//+-------------------------------------------------------------------------------------+//| Функция start |//+-------------------------------------------------------------------------------------+int start()
{
int signal = GetSignal();
if (IsObjectFound() == false)
{
Print("В окне отсуствуют объекты, поиск продолжается...");
return (0);
}
Я показал кусок кода, где возникла непонятка. Все переменные объявлены в глобальных. В функции IsObjectFound() я получаю значения первой и второй точки цены обекта, имя, и значение цены объекта на текущем баре. Если объект найден должно быть, что из функции выходит в режиме true, иначе в false .
В старте, я прописал условие, что если объект не найден, то выходим из функции:
Глобальные переменные - глобальные поиски. Что можно сказать об алгоритме, не видя модели данных?
Я отследил бы именно данные. А действительно ли, isObj булева, ну и все такое ...
//+-------------------------------------------------------------------------------------+//| TradingByLine.mq4 |//| hoz |//| |//+-------------------------------------------------------------------------------------+#property copyright "hoz"#property link ""externstring ___H0 = "Параметры отклонений зоны сигнала";
externdouble dernovich = 40,
faustUs = 40;
/*extern double limitOverLine = 3,
limitUnderLine = 20;*/string objName; // Имя объектаint isObj; // Возвращает окно, которому принадлежит// ..наденнный объект, либо -1double objPrice1, // Первая координата цены луча
objPrice2, // Вторая координата цены луча
objPriceCurr; // Цена объекта на заданном бареint pt;
#define SIGNAL_BUY 0// Сигнал на покупку#define SIGNAL_SELL 1// Сигнал на продажу#define SIGNAL_NO -1// Сигнала нет//+-------------------------------------------------------------------------------------+//| Функция иницилизации |//+-------------------------------------------------------------------------------------+int init()
{
if(Digits == 2 || Digits == 4)
pt = Point;
if(Digits == 1 || Digits == 3 || Digits == 5)
pt = Point*10;
if(Digits == 6)
pt = Point*100;
if(Digits == 7)
pt = Point*1000;
return (0);
}
//+-------------------------------------------------------------------------------------+//| Функция деиницилизации |//+-------------------------------------------------------------------------------------+int deinit()
{
//----//----return (0);
}
//+-------------------------------------------------------------------------------------+//| Сигнализатор касания о луч |//+-------------------------------------------------------------------------------------+bool AlertByTouching(int signal)
{
double priceDevBefore,
priceDevAfter;
if (signal == SIGNAL_SELL)
{
priceDevAfter = objPriceCurr + faustUs * pt;
priceDevBefore = objPriceCurr - dernovich * pt;
if (Bid <= priceDevAfter && Bid >= priceDevBefore)
{
Print("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься продавать!");
Alert("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься продавать!");
return (true);
}
}
if (signal == SIGNAL_BUY)
{
priceDevAfter = objPriceCurr - faustUs * pt;
priceDevBefore = objPriceCurr + dernovich * pt;
Print("priceDevAfter = ", objPriceCurr - faustUs * pt);
Print("priceDevBefore = ", objPriceCurr - faustUs * pt);
Print("Ask >= priceDevAfter && Ask >= priceDevBefore ", Ask ," >= ", priceDevAfter ," && ", Ask ," >= ", priceDevBefore);
if (Ask >= priceDevAfter && Ask >= priceDevBefore)
{
Print("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься покупать!");
Alert("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься покупать!");
return (true);
}
}
return (false);
}
//+-------------------------------------------------------------------------------------+//| Блок поиска своих объектов |//+-------------------------------------------------------------------------------------+bool GetSignal()
{
if (!IsObjectFound())
return (SIGNAL_NO);
if (objPrice1 > objPrice2)
return (SIGNAL_BUY);
if (objPrice1 < objPrice2)
return (SIGNAL_SELL);
}
//+-------------------------------------------------------------------------------------+//| Блок поиска своих объектов |//+-------------------------------------------------------------------------------------+bool IsObjectFound()
{
for (int obj=0; obj<=ObjectsTotal()-1; obj++)
{
objName = ObjectName(obj);
isObj = ObjectFind(objName);
objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
objPriceCurr = ObjectGetValueByShift(objName,0);
}
Print("objPriceCurr = ", objPriceCurr);
if (isObj != -1) // Если объект найден, значит выходим из функцииreturn (true);
return (false); // Объект не найден
}
//+-------------------------------------------------------------------------------------+//| Функция start |//+-------------------------------------------------------------------------------------+int start()
{
int signal = GetSignal();
if (IsObjectFound() == false)
{
Print("В окне отсуствуют объекты, поиск продолжается...");
return (0);
}
if (signal != SIGNAL_NO)
if (!AlertByTouching(signal))
return (0);
Print("objPrice1 = ", objPrice1, ", objPrice2 = ", objPrice2);
// Print("objPriceCurr = ", objPriceCurr);return (0);
}
isObj это int. Возвращает окно, в котором есть объект, если он есть. Если его нет, то, как я понял, вернётся значение -1. Согласно доке с 0 начинается главное окно и дальше подокна... Пока что это набросок для торгового эксперта, чисто сигнальный. Но выдаёт сообщения когда ему вздумается.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Где лучше объявлять тип переменной (int, double и т.д.) с точки зрения уменьшения затратности ресурсов исполнения программы. Напр. int i можно объявить на глобальном уровне, а можно и в int start() ... в for (int i=OrdersTotal()-1; i>=0; i--) ... У меня есть ощущение, что объявление на каждом тике затратнее, чем один раз на глобальном уровне, сразу же после extern parameters. Или же разница в ресурсоёмкости одинакова?
все равно, все переменные (место для переменной в памяти) создаются один раз при старте программы, в дальнейшем переменная должна быть проинициализированна в том месте где она встречается в тексте (объявление переменной),но это случается не всегда, так что если хотите что бы все работало как надо, не забывайте ее явно проинициализировать при объявлении. на скорость не влияет, можете хоть внутри цикла объявлять - проверено.
Код исправил в соответствии с вашим.
При тестировании четыре ордера закрылись в порядке установки на первом тике, пятый - на следующем. Вероятно, здесь что-то ещё не так т.к. тестировал неоднократно.
Код программы и записи из журнала тестера привожу.
С уважением. Shurkin
Все ясно. Замените
на
Имеется следующая ситуация:
Я показал кусок кода, где возникла непонятка. Все переменные объявлены в глобальных. В функции IsObjectFound() я получаю значения первой и второй точки цены обекта, имя, и значение цены объекта на текущем баре. Если объект найден должно быть, что из функции выходит в режиме true, иначе в false .
В старте, я прописал условие, что если объект не найден, то выходим из функции:
В тестере прогоняю, объектов не рисовал, нет ничего - голый график. Тем не менее из функции не выходит, и не принтуется соответственно :
Продолжается дальше выполнение функции старт. Что это за такое?
Глобальные переменные - глобальные поиски. Что можно сказать об алгоритме, не видя модели данных?
Я отследил бы именно данные. А действительно ли, isObj булева, ну и все такое ...
Глобальные переменные - глобальные поиски. Что можно сказать об алгоритме, не видя модели данных?
Я отследил бы именно данные. А действительно ли, isObj булева, ну и все такое ...
isObj это int. Возвращает окно, в котором есть объект, если он есть. Если его нет, то, как я понял, вернётся значение -1. Согласно доке с 0 начинается главное окно и дальше подокна... Пока что это набросок для торгового эксперта, чисто сигнальный. Но выдаёт сообщения когда ему вздумается.