АвторСообщение



Сообщение: 1
Зарегистрирован: 05.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 05.03.13 08:23. Заголовок: помогите с кодом


Пишу индикатор, который рисует линии типа зиг заг на основе анализа уже имеющихся экстремумов зиг зага.
Сначала экстремумы собираю в буфера.
А вот далее нужно сравнивать пики и впадины и если, например, пики понижаются, то линия зиг зага должна рисоваться вниз, а если впадины повышаются, линия зиг зага идет вверх.
Написал вот так:
for(int i=0; i<100; i++)
{
double up = iCustom(NULL,0,"ZZ", 0, i);
double dw = iCustom(NULL,0,"ZZ", 1, i);
if(up!=2147483647) UP = High;
if(dw!=2147483647) DW = Low;

int countUP = ArraySize(UP);
int countDW = ArraySize(DW);

for(int u=0; u<countUP; u++)
{
if(UP<UP[u+1])
{
bufDn=UP;
bufUp=EMPTY_VALUE;
}
}
for(int d=0; d<countDW; d++)
{
if(DW[d]>DW[d+1])
{
bufUp=DW[d];
bufDn=EMPTY_VALUE;
}
}
}
Результат - нулевой. Подскажите, где я ошибаюсь.
Заранее - большое спасибо!

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 49 , стр: 1 2 3 4 All [только новые]







Сообщение: 8
Зарегистрирован: 03.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 05.03.13 11:25. Заголовок: А можете привести ко..


А можете привести код индикатора ZZ?
Если имеется в виду стандартный ZigZag, то для поиска максимумов используйте буфер с индексом 1, а для поиска минимумов - буфер с индексом 2. Буфер 0 состоит из экстремумов обоих типов: и максимумов и минимумов.

P. S. Для прикрепления файлов используйте какой-нибудь бесплатный файловый сервер (например, zalil.ru). А сюда просто вставляйте ссылку на него. Для размещения изображений удобно использовать сервер http://www.imageup.ru/.

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 2
Зарегистрирован: 05.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 05.03.13 11:57. Заголовок: Scriptong, спасибо з..


Scriptong, спасибо за быстрый ответ.
Использовался индикатор rvmGann_sv8, но для личного удобства я его переименовал в ZZ.
Сам код индикатора по ссылке http://zalil.ru/34318988

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 11
Зарегистрирован: 03.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 05.03.13 14:30. Заголовок: Ага, понятно. Теперь..


Ага, понятно. Теперь можно приступить к разбору кода.

1. Вы организовываете цикл, обрабатывающий бары справа налево. Такой подход оправдан, когда необходимо определить последние актуальные данные. Если же нужны все экстремумы, то следует организовывать цикл слева направо по графику, т. е. от большего индекса к меньшему:

 цитата:
for(int i = 100; i > 0; i--)



2. В этой части все правильно:

 цитата:
double up = iCustom(NULL,0,"ZZ", 0, i);
double dw = iCustom(NULL,0,"ZZ", 1, i);



3. Далее следует определить наличие экстремума. По сути, верно. Но, все же, лучше использовать именованные константы, а не их значения. Так код читается легче:

 цитата:
if (up != EMPTY_VALUE)
{
// запомнить максимум
}
if (dw != EMPTY_VALUE)
{
// запомнить минимум
}



4. Назначение этой конструкции мне непонятно:

 цитата:
int countUP = ArraySize(UP);
int countDW = ArraySize(DW);


Если UP и DW - индикаторные буфера, то их размер всегда равен количеству баров на графике (Bars), т. е. countUP всегда будет равно countDW. Кстати, обходить далее все бары графика не имеет смысла, т. к. Вы изначально обходите только 100 из них.

5. Конструкции типа:

 цитата:
if(UP<UP[u+1])
{
bufDn=UP;
bufUp=EMPTY_VALUE;
}


Также неясны. Если UP - Индикаторный буфер, то сравнивать указатель на буфер и значение одного из его элементов не имеет никакого смысла.

Вывод: Для достижения Вашей цели программа должна быть устроена как-то иначе. К примеру, на каждом новом баре, необходимо заново определять пару последних экстремумов, записывая индексы их баров и значения экстремумов. По крайней мере, при работе с фракталами это делается именно так. Аналогичная функция была разработана в одном из последних советников PercentageZigZag_Expert_v7:

 цитата:
//+-------------------------------------------------------------------------------------+
//| Сохранение данных по экстремуму в одну или другую пар переменных |
//+-------------------------------------------------------------------------------------+
void SaveExtremum(int index, double extValue,
int& ext1Index, int& ext2Index,
double& ext1Value, double& ext2Value)
{
if (ext1Index < 0)
{
ext1Index = index;
ext1Value = extValue;
return;
}

ext2Index = index;
ext2Value = extValue;
}
//+-------------------------------------------------------------------------------------+
//| Поиск четырех последних экстремумов PercentageZigZag |
//+-------------------------------------------------------------------------------------+
bool FindLastExtremums(int& max1Index, int& max2Index,
int& min1Index, int& min2Index,
double& max1Val, double& max2Val,
double& min1Val, double& min2Val)
{
int i = 1;
while (i < Bars && (min2Index < 0 || max2Index < 0))
{
double high = iCustom(NULL, 0, "PercentageZigZag_v5", i_percentageChange,
i_changeOfPrevLeg, false, 0, i);
double low = iCustom(NULL, 0, "PercentageZigZag_v5", i_percentageChange,
i_changeOfPrevLeg, false, 1, i);

if (high != EMPTY_VALUE && max2Index < 0) // Найден максимум. Запись экстремума
SaveExtremum(i, High, max1Index,
max2Index, max1Val, max2Val);

if (low != EMPTY_VALUE && min2Index < 0) // Найден минимум. Запись экстремума
SaveExtremum(i, Low, min1Index,
min2Index, min1Val, min2Val);

i++;
}

if (i >= Bars) // До конца истории четыре экстремума
return (false); // ..найти не удалось

return (true);
}



Переменные, передаваемые функции FindLastExtremums по указателю - это четыре пары переменных, каждая из которых описывает свой экстремум. К примеру, переменной max1Index соответствует переменная max1Value. Первая переменная хранит индекс бара ближайшего максимума, а вторая - цену максимума. Соответственно, max2Index - индекс бара дальнего максимума (второго от текущего бара), а max2Value - цену этого максимума.

Спасибо: 1 
ПрофильЦитата Ответить



Сообщение: 3
Зарегистрирован: 05.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 05.03.13 15:01. Заголовок: Scriptong, большое с..


Scriptong, большое спасибо за подробный разбор полетов!
Пока ждал ответа, пересмотрел ваши коды и пришел вот к какому решению:
Пики и впадины я ищу теперь вот такой модифицированной из вашей функцией:

 цитата:
void CreateArray(int limit)
{
for (int i = limit; i >= 0; i--) // Прохождение по обновленной истории
{
Ext1 = 0;
Ext2 = 0;
// - 1 - =========================== Нахождение максимумов ==============================
bool found = false; // Флаг нахождения экстремума (false - нет)
double cur = iCustom(NULL,0,"ZZ", 0, i);

if(cur!=EMPTY_VALUE) //
found=true;
else
found=false;

if (found) // Если максимум найден, то..
Ext1 = cur; // ..отмечаем его
// - 1 - ============================== Окончание блока ================================

// - 2 - ============================ Нахождение минимумов ==============================
found = false; // Флаг нахождения экстремума (false - нет)
cur = iCustom(NULL,0,"ZZ", 1, i);

if (cur!=EMPTY_VALUE)
found = true;
else
found = false;

if (found) // Если минимум найден, то..
Ext2 = cur; // ..отмечаем его
// - 2 - ============================= Окончание блока =================================
}
}



Далее в следующем модифицированном из вашего блоке нахожу последние пары экстремумов:

 цитата:
void ExtremumsFind(int limit)
{
// - 1 - ========= Инициализация переменных, хранящих данные об экстремумах ============
NUp1 = 0; NUp2 = 0; NDn1 = 0; NDn2 = 0;
UpV1 = 0; UpV2 = 0; DnV1 = 0; DnV2 = 0;
// - 1 - ============================= Окончание блока ==================================

for (int i = limit; i < Bars && (NUp2 == 0 || NDn2 == 0); i++)
{
// - 2 - ================================ Поиск максимумов =============================
if (Ext1 > 0) // Найден максимум
if (NUp1 == 0) // Первый максимум еще не найден
{
NUp1 = i; // Сохраняем номер бара
UpV1 = Ext1; // Сохраняем значение экстремума
}
else // Если первый максимум найден
if (NUp2 == 0) // Второй максимум не найден
{
NUp2 = i; // Сохраняем номер бара
UpV2 = Ext1; // Сохраняем значение экстремума
}
// - 2 - ================================ Окончание блока ===============================

// - 3 - ================================ Поиск минимумов ==============================
if (Ext2 > 0) // Найден минимум
if (NDn1 == 0) // Первый минимум еще не найден
{
NDn1 = i; // Сохраняем номер бара
DnV1 = Ext2; // Сохраняем значение экстремума
}
else // Если первый минимум найден
if (NDn2 == 0) // Второй минимум не найден
{
NDn2 = i; // Сохраняем номер бара
DnV2 = Ext2; // Сохраняем значение экстремума
}
// - 3 - ================================ Окончание блока ===============================
}
}



И следующем блоке сравниваю экстремумы и вывожу данные в буфера для отрисовки:

 цитата:
void Results(int limit)
{
for (int i = limit; i >=0; i--)
{
// - 1 - ================= Отслеживание формирования нового максимума ===================
if (Ext1 > 0) // Если есть новый максимум
{
NUp2 = NUp1; //Первый максимум становится вторым
UpV2 = UpV1;
NUp1 = i; // А первый максимум обновляется
UpV1 = Ext1;
}
// - 1 - ============================ Окончание блока ===================================

// - 2 - ================= Отслеживание формирования нового минимума ====================
if (Ext2 > 0) // Если есть новый минимум
{
NDn2 = NDn1; // Первый минимум становится вторым
DnV2 = DnV1;
NDn1 = i; // А первый минимум обновляется
DnV1 = Ext2;
}
// - 2 - ============================ Окончание блока ===================================


// - 4 - ====================== Проверка наличия восходящего канала =====================
if (UpV1 > UpV2 && DnV1 > DnV2) // Первый максимум выше второго и..
{ // ..первый минимум выше второго
UP = UpV1;
}
// - 4 - ============================== Окончание блока =================================

// - 5 - ====================== Проверка наличия нисходящего канала =====================
else
if (UpV1 < UpV2 && DnV1 < DnV2) // Первый минимум ниже второго и..
{ // ..первый максимум ниже второго
DW = DnV1;
}
// - 5 - ============================== Окончание блока =================================


// - 6 - ============================== Окончание блока =================================
}
}


Рисовать индикатор начал, но только как-то кривова-то...
вот картинка click here
И не могу въехать, в чем тут может быть дело :(

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 3
Зарегистрирован: 05.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 17.03.13 16:02. Заголовок: Кто знает как это програмируется?


При создании идикаторов частенько необходимо выставление значков типа DRAW_ARROW чуть выше High или ниже Low. Простое добавление растояния в pip не подходит, так как не корректируется при изменении фрейма и масштаба. Однако встроенный в терминал индикатор фракталов рисуется как надо. Кто знает как это програмируется?
С уважением.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 38
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 1
ссылка на сообщение  Отправлено: 18.03.13 19:09. Заголовок: Sergey пишет: При с..


Sergey пишет:

 цитата:
При создании идикаторов частенько необходимо выставление значков типа DRAW_ARROW чуть выше High или ниже Low. Простое добавление растояния в pip не подходит, так как не корректируется при изменении фрейма и масштаба. Однако встроенный в терминал индикатор фракталов рисуется как надо. Кто знает как это програмируется?


Да, такая проблема существует и она неоднократно обсуждалась на форуме MQL4. Штатной возможности решения проблемы (возможностями языка MQL4) не существует.
Максимум, что можно сделать, это задавать отступ не в пунктах, а в средних волатильностях, т. е.:

 цитата:
up = High + iATR(NULL, 0, 14, i);
dn = Low - iATR(NULL, 0, 14, i);


Достаточно удобное решение.

Стандартный индикатор фракталов оперирует внутренними данными терминала о графике, которые нам недоступны. Для сравнения возьмите этот же индикатор с открытым кодом. Там такой красоты уже нет.

Чтобы отобразить отступы идеально, потребуется наряду с индикатором запустить зацикленный скрипт, который бы постоянно опрашивал график на предмет максимальной и минимальной цен в окне и в соответствии с ними устанавливал отступы от экстремумов. Но такое решение - из пушки по воробьям.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 4
Зарегистрирован: 05.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 18.03.13 20:35. Заголовок: Спасибо за разъяснен..


Спасибо за разъяснение и подсказку.
С уважением!

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 5
Зарегистрирован: 05.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 21.04.13 11:14. Заголовок: Уважаемый Scriptong как это програмируется?


В учебнике по MQL есть пример реализации функции учета ордеров int Terminal() и функции int Events() слежения за их изменениями. Проблема в том, что их результаты обнуляются при перезагрузке или вынужденной остановке советника, т.к. данные массива хранятся внутри советника. Возможна ли организовать сохранность данных при выключении советника в функции int deinit() в формате TXT. DBF или XL и загрузку их в функции int init() при повторном старте? Если да, то как это сделать?
С уважением!

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 85
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 1
ссылка на сообщение  Отправлено: 22.04.13 17:19. Заголовок: Добрый день. Эта пр..


Добрый день.

Эта проблема решается, как минимум, тремя способами:
1. Использовать запись в файл, как Вы и указали. Для этого необходимо использовать Файловые операции. Если будете реализовывать, то рассмотрим подробнее. На мой взгляд, второй способ проще.
2. Записывать данные в глобальные переменные терминала. Это та же самая работа с файлами, но проводит ее сам терминал. Вы будете использовать простые функции.
3. Вместо локальных переменных эксперта использовать глобальные переменные. Но поможет этот способ только в случае, если эксперт не был отключен от графика полностью (смена таймфрейма, символа, настроечных параметров).

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

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 8
Зарегистрирован: 05.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 23.04.13 07:05. Заголовок: Большое спасибо!!!


Игорь, идея в создании функции учета суммы убытков по закрытым ордерам Buy и Sell в раздельности при работе эксперта для последующего анализа. При этом любые действия с терминалом или даже перезагрузка ПК не должна удалять эти данные. Думаю, что работа с файловыми операциями то, что нужно. Хотя попробую "вникнуть и в Глобальные переменные". Вычитал, что они хранятся 2 недели. Смею предположить, что перезапись файлов может сильно повлиять на быстодействие эксперта. Учет ордеров с помощью функций int Terminal() и int Events() мной уже реализован. Как получиться реализовать задуманное отпишусь.
С уважением!

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 89
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 1
ссылка на сообщение  Отправлено: 29.04.13 20:28. Заголовок: Sergey пишет: Игорь..


Sergey пишет:

 цитата:
Игорь, идея в создании функции учета суммы убытков по закрытым ордерам Buy и Sell в раздельности при работе эксперта для последующего анализа.



Для этого случая есть три подхода:

1. Работа с историей счета. В итоге уходим от использования файлов, но для этого потребуется точная идентификация ордеров, открытых экспертом. Обычно для этого достаточно уникального Magic Number при открытии ордеров. Недостаток этого способа - история счета не всегда может быть доступной: либо пользователь изменил ее отображение на "Сегодня", либо брокер заархивировал сделки за некоторый период.

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

3. Универсальный и несколько оригинальный способ, который не привязан к терминалу, позволяя запускать советник на разных компьютерах при условии доступа к одному и тому же счету. Информацию о текущих расчетах можно представлять в виде отложенных ордеров. Например, чтобы записать текущую прибыль/убыток по ордерам типа Sell советник устанавливает отложенный ордер Sell Stop по некоторой очень далекой цене (чтобы ордер гарантированно не сработал), например, Point. При этом полезная информация может храниться сразу в двух параметрах отложенного ордера: Magic Number и объеме ордера. Например, в объем можно записать совокупный объем закрытых ордеров, в Magic Number - значение прибыли/убытка в пунктах. Аналогично для ордеров Buy - устанавливать отложенный ордер Buy Limit по цене Point. При этом советник в момент изменения данных просто удаляет имеющиеся ордера, а потом заново их устанавливает. В итоге вся полезная информация хранится на сервере брокера.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 13
Зарегистрирован: 05.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 05.05.13 21:07. Заголовок: Универсальный и несколько оригинальный способ


Идея супер! Спасибо!

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 15
Зарегистрирован: 05.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 19.05.13 20:31. Заголовок: Нужно ограничить вре..


Нужно ограничить время существования отложенного ордера при его выставлении
int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)
параметр datetime expiration. Не могу понять как правильно его расчитать. Я сделал так: Time[0]+Period()*60*k, гда k-количестово баров после которых должен удалиться отложенный ордер. При тесте то выдается ошибка 3-неправильный параметр, то все проходит нормально. В чем дело не могу понять?



Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 16
Зарегистрирован: 05.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 20.05.13 07:30. Заголовок: Решил проблему испо..



Решил проблему используя функцию OrderSelect(), написал так

if ((OrderOpenTime()+Period()*60*k)<Time[0])
if (!OrderDelete(OrderTicket())) return(False);

Уважаемый Scriptong, если не затруднит, подскажите на будущее в чем ошибка в первом варианте?

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 100
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 1
ссылка на сообщение  Отправлено: 20.05.13 09:00. Заголовок: Sergey пишет: подск..


Sergey пишет:

 цитата:
подскажите на будущее в чем ошибка в первом варианте?


По большому счету, ошибки нет. Время истечения ордера указывается в формате времени, т. е. ставится любое будущее время сервера.
Есть лишь один нюанс, который, почему-то, не документирован. Касается он минимальной дельты времени между текущим временем и временем истечения. Эта дельта равна 10 минутам. В итоге, если устанавливается ордер в 10:30:00, а время его истечения 10:39:59, то получим ошибку установки ордера. Бороться с этим просто:

 цитата:

#define MIN_EXPIRATION_SECONDS 600
...
int barsCnt = 10;
datetime expTime = TimeCurrent() + Period() * 60 * barsCnt;
expTime = MathMax(expTime, TimeCurrent() + MIN_EXPIRATION_SECONDS);
int ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, Bid - 50 * Point, 0, 0, NULL, 0, expTime);



По этой же причине расчет времени истечения относительно времени открытия нулевой свечи является не совсем корректным, т. к. может привести к малой дельте существования ордера.

Ну и не забудем упомянуть еще один момент - далеко не все брокеры поддерживают использование времени истечения ордера.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 17
Зарегистрирован: 05.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 20.05.13 17:50. Заголовок: Большое спасибо! Не ..


Большое спасибо!
Не знал о существовании дельты по времени. Только прочитав Ваш коментарий заметил, что тестирование на Н1 проходило успешно, а на М5 давало ошибку.
Код записал себе в блокнот.
Еще раз огромное спасибо!

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 20
Зарегистрирован: 05.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 26.06.13 13:28. Заголовок: Графическое управление торговлей


Уважаемый Scriptong!
Решил использовать Ваш скрипт FollowPositions "Графическое управление торговлей".
Весь текст отображается иероглифами.
В чем причина и что делать?

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 118
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 1
ссылка на сообщение  Отправлено: 01.07.13 09:13. Заголовок: Добрый день. Скорее..


Добрый день.

Скорее всего, проблема заключается в том, что в ОС нет нужного шрифта. В данном случае это шрифт с именем "Courier". Выходов из ситуации два:
1. Найти такой шрифт в интернете (как ни странно, но у меня его тоже нет; тем не менее, все отображается корректно) и скопировать в папку Fonts, лежащую в папке, где установлена Windows (чаще всего - C:\Windows).
2. Изменить шрифт, используемый программой. Для этого достаточно открыть файл FollowPosistions.mq4, найти именованную константу FONT_NAME (строка 32), указать в этой строке имя другого шрифта и перекомпилировать проект (F5 или F7). Важно, чтобы новый шрифт был моноширинным (такие, как Courier New). В противном случае графика может отображаться с перекосами.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 21
Зарегистрирован: 05.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 02.07.13 06:40. Заголовок: Scriptong пишет: 2...


Scriptong пишет:

 цитата:
2. Изменить шрифт


Огромное спасибо. Все вышло по второму варианту. В ОС шрифт шел как "Courier(TrueType)". Изменил название в скрипте и все столо на свои места.

Еще одна присьба: Что необходимо изменить, чтобы скрипт высвечивал для выбора только тот инструмент, на котором он открыт, а не все ордера по всем валютным парам?

И в качестве общего предложения: При работе с большим количеством ордеров, лучше прописать в таблице не только тикет, но и инструмент и отсортировать ордера по инструменту для удобства в работе.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 122
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 1
ссылка на сообщение  Отправлено: 08.07.13 18:12. Заголовок: Sergey пишет: Еще о..


Sergey пишет:

 цитата:
Еще одна присьба: Что необходимо изменить, чтобы скрипт высвечивал для выбора только тот инструмент, на котором он открыт, а не все ордера по всем валютным парам?


Файл FolllowPositions_AddPosition.mqh найти функцию AP_FindAllPositions. Строку:

 цитата:
if (OrderType() < 2) // Если найдена позиция


заменить на такую:

 цитата:
if (OrderType() < 2 && OrderSymbol() == Symbol()) // Если найдена позиция по текущему инструменту



Sergey пишет:

 цитата:
И в качестве общего предложения: При работе с большим количеством ордеров, лучше прописать в таблице не только тикет, но и инструмент и отсортировать ордера по инструменту для удобства в работе.


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

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 69
Зарегистрирован: 25.08.13
Репутация: 1
ссылка на сообщение  Отправлено: 27.10.13 12:09. Заголовок: Добрый день! Опять ..


Добрый день!

Опять я не могу найти свою старую ошибку в трейлинге. Почему не работает? Снова наверное ошибка в скобках или тому подобное.

//--- Трейлинг BUY----------------

OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES);
{
if (OrderTicket()!=0 && OrderType()==OP_BUY && Bid>OrderOpenPrice()+TS*Point && Bid>OrderStopLoss()+TS*Point && Bid>OrderStopLoss()+ST*Point)
{
TiketBuy=OrderTicket();
OrderModify(TiketBuy,OrderOpenPrice(),Ask-TS*Point,0,0,CLR_NONE);
}
}

//--- Трейлинг SELL----------------

OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES);
{
if (OrderTicket()!=0 && OrderType()==OP_SELL && Ask<OrderOpenPrice()-TS*Point && Ask<OrderStopLoss()-TS*Point && Ask<OrderStopLoss()-ST*Point)
{
TiketSell=OrderTicket();
OrderModify(TiketSell,OrderOpenPrice(),Ask-TS*Point,0,0,CLR_NONE);
}
}

Ордера BUY тралит, а SELL нет.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 233
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 2
ссылка на сообщение  Отправлено: 29.10.13 10:48. Заголовок: Здесь сразу бросаетс..


Здесь сразу бросается в глаза вот эта функция:

 цитата:
OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES);


Она в данном случае бесполезна, т. к. служит для выбора ордера по позиции в списке рабочих ордеров. Вы же, вместо номера позиции, пытаетесь передать тикет уже выбранного ордера. Нужно определить, какие исходные данные для выбора ордера у Вас есть: тикет или порядковый номер. Если нет ни того, ни другого, то нужно идти путем перебора всех ордеров списка и передвижением трала для каждого из них:

 цитата:
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS))
continue;

if (OrderSymbol() != Symbol())
continue;

if (OrderType() == OP_BUY)
{
// Трал для ордеров Buy
}

if (OrderType() == OP_SELL)
{
// Трал для ордеров Sell
}
}



Ну а далее нужно просто определиться с условиями трала, т. к. в нынешнем виде условия дублируют друг друга. Например, для классического трала условием является поддержание заданного расстояния в пунктах между ценой и Stop Loss ордера в прибыльной части ордере. Для Buy условие будет такое:

 цитата:
if (Bid > OrderOpenPrice() + TS * Point + Point / 10 && OrderStopLoss() < Bid - TS * Point - Point / 10)
OrderModify(OrderTicket(), 0, NormalizeDouble(Bid - TS * Point, Digits), OrderTakeProfit(), 0);



Соответственно для Sell:

 цитата:
if (Ask < OrderOpenPrice() - TS * Point - Point / 10 && OrderStopLoss() > Ask + TS * Point + Point / 10)
OrderModify(OrderTicket(), 0, NormalizeDouble(Ask + TS * Point, Digits), OrderTakeProfit(), 0);




Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 70
Зарегистрирован: 25.08.13
Репутация: 1
ссылка на сообщение  Отправлено: 30.10.13 20:24. Заголовок: Спасибо!..


Спасибо!

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 47
Зарегистрирован: 05.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 11.11.13 11:24. Заголовок: Помогите с кодом


Возможно ли объявить двумерный массив, если колличесто его элементов вычисляется расчетным путем. Если ДА, то как это сделать.

Пример ошибки:

int k=MathGeil(все переменные положительные); - значение !=0
double Mas[3][k];

Ошибка:
k - integer number expected
] - comma or semicolon expected
Mas - variable not defined

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 241
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 2
ссылка на сообщение  Отправлено: 11.11.13 14:08. Заголовок: Sergey пишет: Возмо..


Sergey пишет:

 цитата:
Возможно ли объявить двумерный массив, если колличесто его элементов вычисляется расчетным путем. Если ДА, то как это сделать.


Если воспринимать весь вопрос в совокупности, то ответ однозначно нет. Но, думаю, нужно пояснить имеющиеся возможности.

Проблема заключается в том, что нельзя изменить количество элементов массива во втором измерении и выше. Их всегда нужно указывать на этапе компиляции программы.
Но есть возможность изменять количество элементов в первом измерении. Для этого достаточно объявить массив неопределенного размера, а затем изменить его размер уже по ходу выполнения программы:

 цитата:
double array[]; // Объявление массива неопределенного размера
int start()
{
int newSize = ...; // Определение нового размера массива
int resSize = ArrayResize(array, newSize); // Попытка изменения размера массива
if (resSize != newSize)
{
// Ошибка изменения размера массива. Чаще всего, связано с нехваткой памяти
}
else
{
// Успешное изменение размера массива
}
}


Поэтому в приведенном примере можно поступить просто - транспонировать матрицу (поменять местами столбцы и строки массива):

 цитата:

double Mas[][3];
int k = MathGeil(все переменные положительные); - значение !=0
int resSize = ArrayResize(Mas, k);
if (resSize != k * 3)
{
// Ошибка изменения размера массива. Чаще всего, связано с нехваткой памяти
}
else
{
// Успешное изменение размера массива
}



В тех случаях, когда необходимо определять все измерения массива по ходу программы, рекомендуется использовать одномерные массивы, которые мысленно представлять как многомерные. Например, массив с измерениями 5 (первое измерение - строки) и 6 (второе измерение - столбцы) легко заменяется на массив из 30-и элементов в первом измерении. При этом если нужно обратиться к элементу, находящемуся в третьей строке (т. к. отсчет с нуля, то индекс 2) четвертого столбца (индекс - 3), то производим такие математические действия:

 цитата:
2 (индекс строки) * 6 (размер в виртуальном втором измерении) + 3 (индекс столбца) = 15


Подобным образом можно поступать с массивами любых измерений, не ограничиваясь четвертым измерением. К тому же, в памяти массивы хранятся как одномерная последовательность. Поэтому многомерные массивы - это лишь виртуальность программирования. Например, в C++ нет многомерных массивов.



Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 48
Зарегистрирован: 05.03.13
Репутация: 0
ссылка на сообщение  Отправлено: 11.11.13 15:00. Заголовок: Большое спасибо за п..


Большое спасибо за подробный ответ. Многого из сказанного нет в учебниках. Буду изучать.
Пака вышел из ситуации так.

int k=MathGeil(все переменные положительные); - значение !=0
double Mas[3][1000];

for (int i=0; i<=k; i++) - цикл заполнения второго измерения, где k<< 1000

С уважением!

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 112
Зарегистрирован: 05.03.13
Репутация: 1
ссылка на сообщение  Отправлено: 02.01.14 12:15. Заголовок: Ести таблица Excel, ..


Есть таблица Excel, как перенести данные ячеек в двумерный массив MQL?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 367
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация: 1
ссылка на сообщение  Отправлено: 02.01.14 16:11. Заголовок: Sergey пишет: Есть ..


Sergey пишет:

 цитата:
Есть таблица Excel, как перенести данные ячеек в двумерный массив MQL?



С Новым Годом, Сергей!

Похожий вопрос я встречал ЗДЕСЬ и там были ссылки.

И на сайте MQL4 был код Обмен данными и управление Excel
mt4excel.dll - библиотека написанная на Delphi. При вызове DLL, инициализируется библиотека COM.

Перед использованием необходимо вызвать одну из следующих функций: ExcelOpen или ExcelOpenPattern, или ExcelOpenFile.

При вызове происходит создание OLE объекта, открывается Excel, создается новая книга и страница, или по шаблону, или загружается файл Excel (в зависимости от функции). Функция ExcelClose закрывает Excel и осовобождает OLE объект.

Писать и читать можно либо в отдельную ячейку: ExcelSetFormulaCell, ExcelSetValueCell, ExcelSetTextCell, ExcelGetValueCell, ExcelGetTextCell, ExcelGetFormulaCell

Либо в диапазон, предварительно запомнив его функцией ExcelSetRange, затем используя ExcelSetFormula например, или другие функции где требуется диапазон.

Есть ряд вспомогательных функций для управления отображением, информации о формате и т.д. Более подробно - комментарии в примере.

Для создания диаграммы функция ExcelSetDiagramma.



С уважением! Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 113
Зарегистрирован: 05.03.13
Репутация: 1
ссылка на сообщение  Отправлено: 04.01.14 17:07. Заголовок: Genry пишет: И на ..


Genry пишет:


 цитата:
И на сайте MQL4 был код Обмен данными и управление Excel



Спасибо Genry, кажется то, что нужно. Буду разбираться. У тебя завидная информационная осведамленность. Так держать!

Удачи в новом году!

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 369
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация: 1
ссылка на сообщение  Отправлено: 04.01.14 18:33. Заголовок: Sergey пишет: У теб..


Sergey пишет:

 цитата:
У тебя завидная информационная осведамленность


В 90-х работал технологом в конторе по разработке программных систем. Основная задача - знать какое есть уже готовое ПО, чтобы
его использовать, а не изобретать велосипед. А вторая задача - проверка готового ПО на соответствие ТЗ, так что
навык остался - быть в курсе у кого и какие программы, и как они работают

Кстати, VNG_nemo в сообщении по обработке биржевых данных тоже давал ссылку на этот софт.

Sergey пишет:

 цитата:
Удачи в новом году!


Взаимно!

С уважением! Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 7
Зарегистрирован: 05.01.15
Откуда: Узбекистан, Ташкент
Репутация: 0
ссылка на сообщение  Отправлено: 24.05.15 14:49. Заголовок: Здравствуйте!!! Пожа..


Здравствуйте!!! Пожалуйста помогите с кодом?!

if (AccountNumber()) tradetrue = TRUE;
else {
Alert("Password wrong. Please Contact ****@***.com");
tradetrue = FALSE;
return (0);


Этот код работает на советников(для аккаунт лок). Но он не работает при индикаторов. Как его могу работать на индикаторе?

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 1560
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 24.05.15 15:59. Заголовок: Добрый день. Указанн..


Добрый день.
Указанный код будет одинаково работать как в советнике, так и в индикаторе. Причем вне зависимости от номера счета не будет происходить прерывание работы программы. Ведь значение AccountNumber, кроме некоторых специфических случаев, всегда более нуля. Любое значение больше нуля рассматривается компилятором как истинное значение.
Нужно сделать так:

 цитата:

#property strict
#define CORRECT_ACCOUNT_NUMBER 123456

int OnInit()
{
if (AccountNumber() != CORRECT_ACCOUNT_NUMBER)
{
Alert("Password wrong. Please Contact ****@***.com");
return INIT_FAILED;
}

return INIT_SUCCEEDED;
}


Будет работать в любой программе MQL4: при неверном номере счета программа автоматически удалится с графика.

Спасибо: 1 
ПрофильЦитата Ответить





Сообщение: 8
Зарегистрирован: 05.01.15
Откуда: Узбекистан, Ташкент
Репутация: 0
ссылка на сообщение  Отправлено: 24.05.15 21:08. Заголовок: Спасибо за быстрая о..


Спасибо за быстрая ответа!!!

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 9
Зарегистрирован: 05.01.15
Откуда: Узбекистан, Ташкент
Репутация: 0
ссылка на сообщение  Отправлено: 27.12.15 12:51. Заголовок: Пожалуйста помогите с кодом?!



Здравствуйте, мой учитель Scriptong! Пожалуйста, помогите с кодом?! У меня есть индикатор со стрелками. Но без буферов. Мне надо получить сигнал для советника, который открывает сделку, используя эти стрелки. Индикатор только с ех4 формате: Indicator
Как я могу получит сигнал от графика? Подскажите мне пожалуйста?!

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 2168
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация: 3
ссылка на сообщение  Отправлено: 27.12.15 15:35. Заголовок: skilful_coder пишет:..


skilful_coder пишет:

 цитата:
Пожалуйста, помогите с кодом?! У меня есть индикатор со стрелками. Но без буферов. Мне надо получить сигнал
для советника, который открывает сделку, используя эти стрелки. Индикатор только с ех4 формате: Indicator



Возможно у Игоря новогодние каникулы , попробую Вам помочь:

Этот вопрос обсуждался здесь: http://forum.mql4.com/ru/47117. Только у Вашего
индикатора другое имя: scalping_future. Продолжение было здесь: https://www.mql5.com/ru/code/10675

Еще один вариант исходника этого индикатора: http://www.fxfisherman.com/forums/forex-metatrader/indicators/11121-best-till-now.html

Если запустите торговлю на своем ЕА или ТарасаBY - расскажите, pls, какой будет результат?




 цитата:
Как я могу получит сигнал от графика? Подскажите мне пожалуйста?!


Недостаток при использовании графических сигналов: при оптимизации советник не может использовать данные от графических
объектов, это проблема такого подхода.

У Вас теперь есть исходный код - добавьте туда буфера. А сигнальные стрелки, которые Вам надо считывать, находятся в
таблице графических объектов.



Читать их менее удобно чем буфера, поэтому редко кто замарачивается чтением
графических объектов, можно получить этот сигнал считав и обработав данные от индикатора, как
указано в ссылке http://forum.mql4.com/ru/47117. :

int FilterPeriod = 22;
int SL_distance_pips = 20;

//+----------------------------------------------------------------------------+
//| Описание : Возвращает торговый сигнад |
//+----------------------------------------------------------------------------+
int GetSignal (string vSymbol, int fi_Bar = 5)
{
double ld_Signal_0 = iCustom (NULL, 0, "Arrow_2", FilterPeriod, SL_distance_pips, 0, 0),
ld_Signal_Bar = iCustom (NULL, 0, "Arrow_2", FilterPeriod, SL_distance_pips, 0, fi_Bar);
int vSignal = 0;
//----
if (ld_Signal_Bar <= -0.9 && ld_Signal_0 > -0.9) vSignal = 1; //up
if (ld_Signal_Bar >= 0.9 && ld_Signal_0 < 0.9) vSignal = -1; //down
//----
return (vSignal);
}

У Игоря есть примеры обработки сигналов графических объектов, например здесь чтение данных прямоугольника: http://www.admiralmarkets.ru/mqlabs/11.03.2014-mqlabs-pamyat-rynka-chast-5

С уважением! Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 10
Зарегистрирован: 05.01.15
Откуда: Узбекистан, Ташкент
Репутация: 0
ссылка на сообщение  Отправлено: 27.12.15 13:55. Заголовок: Вот код советника: ..


Вот код советника:

#property version "1.00"
#property strict

input string NameEA = "Советник"; //EA Name
input double FixedLots = 0.1; //Lot Size
input double StopLoss = 20; //Stop Loss
input double TakeProfits = 20; //Take Profit
input int MagicNumber = 123; //Magic Number
input int MaxOpenOrders = 1; //Max.Open Orders
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
int PipValue=1,digit_lot=0,Lot_Digits;
double ClosingArray[100],Lots,Sloss,Tprof,point;
bool Buy=0,Sell=0,comm4=0;
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if((Bid<10 && _Digits==5)||(Bid>10 && _Digits==3)){PipValue= 10;}
if((Bid<10 && _Digits==4)||(Bid>10 && _Digits==2)){PipValue= 1;}
point = PipValue*Point;
if(MarketInfo(Symbol(),MODE_LOTSTEP)>=0.01) digit_lot=2;
if(MarketInfo(Symbol(),MODE_LOTSTEP)>=0.1) digit_lot=1;
if(MarketInfo(Symbol(),MODE_LOTSTEP)>=1) digit_lot=0;
return(INIT_SUCCEEDED);
}
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
//+------------------------------------------------------------------+
//| Get Signals |
//+------------------------------------------------------------------+
void Indicators(){

Buy = (iCustom(NULL,0,"Arrow 2",0,1) != 0);
Sell = (iCustom(NULL,0,"Arrow 2",1,1) != 0);
}
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
//+------------------------------------------------------------------+
//| Lot Size |
//+------------------------------------------------------------------+
void LotsSize(){
Lots = FixedLots;
if(Lots<MarketInfo(Symbol(),MODE_MINLOT)) Lots=MarketInfo(Symbol(),MODE_MINLOT);
if(Lots>MarketInfo(Symbol(),MODE_MAXLOT)) Lots=MarketInfo(Symbol(),MODE_MAXLOT);
}
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}

//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
//+------------------------------------------------------------------+
//| Get total order |
//+------------------------------------------------------------------+
int Orders(int type)
{
int count=0;
//-1= All,0=Buy,1=Sell,2=BuyLimit,3=SellLimit,4=BuyStop,5=SellStop;
for(int x=OrdersTotal()-1;x>=0;x--)
{
if(OrderSelect(x,MODE_TRADES)){
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
if(type < 0){ count++;}
if(OrderType() == type && type >= 0){ count++;}
}}}
return(count);
}
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
//+------------------------------------------------------------------+
//| Expert start function |
//+------------------------------------------------------------------+
void OnTick(){

LotsSize();Indicators();int num = Orders(-1);
//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
bool band = 0,ban = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
if(OrderSelect (i, SELECT_BY_POS))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if(OrderOpenTime() >= iTime(NULL,0,0)) ban = true;
}}
if(ban){return;}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Error in history!"); break;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if(OrderOpenTime() >= iTime(NULL,0,0)) band = true;
}}
if(band){return;}
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
if(num < MaxOpenOrders){
if(Buy){
if(StopLoss == 0){Sloss = 0;} else{
Sloss = Ask - StopLoss * point;}
if(TakeProfits == 0){Tprof = 0;}else{
Tprof = Bid + TakeProfits * point;}
int Tiketb = OrderSend(Symbol(),OP_BUY,Lots,Ask,3*PipValue,Sloss,Tprof,NameEA,MagicNumber,0,Blue);
}
if(Sell){
if(StopLoss == 0){Sloss = 0;}else{
Sloss = Bid + StopLoss * point;}
if(TakeProfits == 0){Tprof = 0;}else{
Tprof = Ask - TakeProfits * point;}
int Tikets = OrderSend(Symbol(),OP_SELL,Lots,Bid,3*PipValue,Sloss,Tprof,NameEA,MagicNumber,0,Red);
}}
return;
}


Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 11
Зарегистрирован: 05.01.15
Откуда: Узбекистан, Ташкент
Репутация: 0
ссылка на сообщение  Отправлено: 27.12.15 17:59. Заголовок: Дорогой Scriptong, т..


Дорогой Scriptong, теперь я только жду вашего ответа. Потому что ответ Genry не удовлетворяет меня.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 1971
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 29.12.15 17:19. Заголовок: skilful_coder пишет:..


skilful_coder пишет:

 цитата:
Дорогой Scriptong, теперь я только жду вашего ответа. Потому что ответ Genry не удовлетворяет меня.


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

 цитата:
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Автор : TarasBY |
//+-----------------------------------------------------------------------------------+
//| Возвращает торговый сигнад |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_Signal (string fs_Symbol, int fi_Bar = 5)
{
double ld_Signal_0 = iCustom (fs_Symbol, TF_Indicator, "scalping_future", FilterPeriod, SL_distance_pips, 0, 0), ld_Popravka = 0.3,
ld_Signal_Bar = iCustom (fs_Symbol, TF_Indicator, "scalping_future", FilterPeriod, SL_distance_pips, 0, fi_Bar);
int li_Signal = -1;
//----
if (ld_Signal_Bar <= -LevelControl && ld_Signal_0 > ld_Popravka - LevelControl) li_Signal = UP; //up
if (ld_Signal_Bar >= LevelControl && ld_Signal_0 < LevelControl - ld_Popravka) li_Signal = DW; //down
//----
return (li_Signal);
}


Вам нужно лишь заменить имя индикатора. А еще лучше - взять неперерисовывающуюся версию, которую представил тот же TarasBY. Ведь Ваша версия индикатора потому и хороша на истории, что в реальности меняет свои показания как заправский лжесвидетель.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 12
Зарегистрирован: 05.01.15
Откуда: Узбекистан, Ташкент
Репутация: 0
ссылка на сообщение  Отправлено: 03.01.16 15:39. Заголовок: Здравствуйте учитель..


Здравствуйте учитель! Спасибо за ответ. Теперь у меня есть другое просьба. Пожалуйста помогите с кодом?! Пожалуйста посмотрите на этот картинок: Индикатор должен показать только первую стрелки (1-2-1-2-1-2). Остальное между 1 и 2 не надо показать. Как я могу кодироваться?!
индикаторы

Код:

//+-------------------------------------------------------------------+
//| Стрелка.mq4 |
//+-------------------------------------------------------------------+
#property copyright "NEW"
#property link "NEW"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 12
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 Lime
#property indicator_color4 Red
#property indicator_color5 Lime
#property indicator_color6 Red
#property indicator_color7 Lime
#property indicator_color8 Red

double CrossUp[];
double CrossDown[];

input string Parmetrs_indicator = "-------------------< SETTINGS >-------------------";//INDICATORS PARAMETERS
input string _________________________="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";//____________Slope Direction Indicator
input int period = 34; //Period
input int method = 3; //Method
input int price = 0; //Price
input string ________________________="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";//____________Average MACD Indicator
input int Price2 = 8; //Price
input int method2 = 5; //Fast Period
input int price2 = 13; //Slow Period
input int period2 = 7; //Signal Period
input int method3 = 1; //Method
input string __________________="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";//_______Heiken Ashi Oscillator Indicator
input int Averageperiod = 2; //Average Period
input string ________________="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";//_________________Arrow settings
input bool ShowArrows = 1; //Show Arrows
input int arrowsUpCode = 233; //Arrows Up Code
input int arrowsDnCode = 234; //Arrows Dn Code
input int arrowsUpSize = 4; //Arrows Up Size
input int arrowsDnSize = 4; //Arrows Dn Size
input int gap = 5; //Gap
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
int PipValue = 1,buy=0,sell=0;
double point; int Zap;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init(){

if((Bid<10 && _Digits==5)||(Bid>10 && _Digits==3)) {PipValue=10;}
if((Bid<10 && _Digits==4)||(Bid>10 && _Digits==2)) {PipValue= 1;}
point = PipValue * Point;

SetIndexStyle(0, DRAW_ARROW, EMPTY,arrowsUpSize);
SetIndexArrow(0, arrowsUpCode);
SetIndexBuffer(0, CrossUp);
SetIndexStyle(1, DRAW_ARROW, EMPTY,arrowsDnSize);
SetIndexArrow(1, arrowsDnCode);
SetIndexBuffer(1, CrossDown);

return(0);}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start(){
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
int limit,i;
double RSI,RSI1,RSI2,RSI12,RSI11,RSI3,
RSI6,RSI7,RSI10,RSI0,RSI8,RSI9,RSI20,RSI30,Slop,Slop2;
int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
for(i = 0; i <= limit; i++){
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Slop = iCustom(NULL,0,"SlopeDirection",period,method,price,0,0,0,i+1);
Slop2 = iCustom(NULL,0,"SlopeDirection",period,method,price,0,0,0,i+2);
RSI = iCustom(NULL,0,"SlopeDirection",period,method,price,0,0,1,i+1);
RSI0 = iCustom(NULL,0,"SlopeDirection",period,method,price,0,0,1,i+2);
RSI1 = iCustom(NULL,0,"SlopeDirection",period,method,price,0,0,2,i+1);
RSI10 = iCustom(NULL,0,"SlopeDirection",period,method,price,0,0,2,i+2);
RSI11 = iCustom(NULL,0,"SlopeDirection",period,method,price,0,0,1,i+2);
RSI12 = iCustom(NULL,0,"SlopeDirection",period,method,price,0,0,2,i+2);
RSI2 = iCustom(NULL,0,"average_MACD_-_mtf_u_alerts2divergence"," ",Price2,method2,price2,period2,method3,0,0,0,LimeGreen,OrangeRed," ",1,1,0.005,0.0025,0.001,-0.001,-0.0025,-0.005,0,4,i+1);
RSI3 = iCustom(NULL,0,"average_MACD_-_mtf_u_alerts2divergence"," ",Price2,method2,price2,period2,method3,0,0,0,LimeGreen,OrangeRed," ",1,1,0.005,0.0025,0.001,-0.001,-0.0025,-0.005,0,4,i+2);
RSI20 = iCustom(NULL,0,"average_MACD_-_mtf_u_alerts2divergence"," ",Price2,method2,price2,period2,method3,0,0,0,LimeGreen,OrangeRed," ",1,1,0.005,0.0025,0.001,-0.001,-0.0025,-0.005,0,5,i+1);
RSI30 = iCustom(NULL,0,"average_MACD_-_mtf_u_alerts2divergence"," ",Price2,method2,price2,period2,method3,0,0,0,LimeGreen,OrangeRed," ",1,1,0.005,0.0025,0.001,-0.001,-0.0025,-0.005,0,5,i+2);
RSI6 = iCustom(NULL,0,"HeikenAshiOscillator",Averageperiod,0,i+2);
RSI7 = iCustom(NULL,0,"HeikenAshiOscillator",Averageperiod,0,i+1);
RSI8 = iCustom(NULL,0,"HeikenAshiOscillator",Averageperiod,1,i+2);
RSI9 = iCustom(NULL,0,"HeikenAshiOscillator",Averageperiod,1,i+1);
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
if (ShowArrows && (Slop < iClose(NULL,0,i+1) && RSI7 != 0.0 && RSI2 < 0.0 && RSI20 < RSI2 &&
((((iHigh(NULL,0,i+1) - iLow(NULL,0,i+1))*70)/100) + iLow(NULL,0,i+1)) < iClose(NULL,0,i+1)) && !(Slop2 < iClose(NULL,0,i+2) && RSI6 != 0.0 &&
RSI3 < 0.0 && RSI30 < RSI3 && ((((iHigh(NULL,0,i+2) - iLow(NULL,0,i+2))*70)/100) + iLow(NULL,0,i+2)) < iClose(NULL,0,i+2)))
{
CrossUp[i+1] = (iLow(NULL,0,i) - gap * point);
}
if (ShowArrows && (Slop > iClose(NULL,0,i+1) && RSI9 != 0.0 && RSI2 > 0.0 && RSI20 > RSI2 &&
((((iHigh(NULL,0,i+1) - iLow(NULL,0,i+1))*30)/100) + iLow(NULL,0,i+1)) > iClose(NULL,0,i+1)) && !(Slop2 > iClose(NULL,0,i+2) && RSI8 != 0.0 &&
RSI3 > 0.0 && RSI30 > RSI3 && ((((iHigh(NULL,0,i+2) - iLow(NULL,0,i+2))*30)/100) + iLow(NULL,0,i+2)) > iClose(NULL,0,i+2)))
{
CrossDown[i+1] = (iHigh(NULL,0,i) + gap * point);
}}
return(0);
}

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 1986
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 05.01.16 11:57. Заголовок: skilful_coder пишет:..


skilful_coder пишет:

 цитата:
Индикатор должен показать только первую стрелки (1-2-1-2-1-2). Остальное между 1 и 2 не надо показать. Как я могу кодироваться?!


Нужно запомнить, какой тип стрелки был отображен последним, и, если новая стрелка совпадает по типу с предыдущей, то не выводить ее. То есть вот эти условия должны выглядеть примерно так:

 цитата:
if (ShowArrows && (Slop < iClose(NULL,0,i+1) && RSI7 != 0.0 && RSI2 < 0.0 && RSI20 < RSI2 &&
((((iHigh(NULL,0,i+1) - iLow(NULL,0,i+1))*70)/100) + iLow(NULL,0,i+1)) < iClose(NULL,0,i+1)) && !(Slop2 < iClose(NULL,0,i+2) && RSI6 != 0.0 &&
RSI3 < 0.0 && RSI30 < RSI3 && ((((iHigh(NULL,0,i+2) - iLow(NULL,0,i+2))*70)/100) + iLow(NULL,0,i+2)) < iClose(NULL,0,i+2)) && тип последней стрелки не равен "вверх")


и

 цитата:
if (ShowArrows && (Slop > iClose(NULL,0,i+1) && RSI9 != 0.0 && RSI2 > 0.0 && RSI20 > RSI2 &&
((((iHigh(NULL,0,i+1) - iLow(NULL,0,i+1))*30)/100) + iLow(NULL,0,i+1)) > iClose(NULL,0,i+1)) && !(Slop2 > iClose(NULL,0,i+2) && RSI8 != 0.0 &&
RSI3 > 0.0 && RSI30 > RSI3 && ((((iHigh(NULL,0,i+2) - iLow(NULL,0,i+2))*30)/100) + iLow(NULL,0,i+2)) > iClose(NULL,0,i+2)) && тип последней стрелки не "вниз")


а при выводе стрелки запоминать ее тип:

 цитата:

{
CrossUp[i+1] = (iLow(NULL,0,i) - gap * point);
тип последней стрелки - "вверх"
}


и

 цитата:
{
CrossDown[i+1] = (iHigh(NULL,0,i) + gap * point);
ти последней стрелки - "вниз"
}



Также Вам нужно будет учесть, что такой подход будет работать только на истории. Для второго и последующих тиков, которые индикатор обработает, нужно будет дополнительно по истории определять тип последней стрелки, т. е. еще до входа в основной цикл.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 13
Зарегистрирован: 05.01.15
Откуда: Узбекистан, Ташкент
Репутация: 0
ссылка на сообщение  Отправлено: 03.01.16 15:42. Заголовок: КАРТИНКА для пример..

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 380
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 06.01.16 17:48. Заголовок: Классно в обще-то! т..


Классно в обще-то!

Хорошо давай по другому.
Твой советник, 32 бита - МТ - как "очистить" память (исходные сохраняются)?
В тестере же память не накапливается.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 1991
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 07.01.16 20:48. Заголовок: Balbesik пишет: Кла..


Balbesik пишет:

 цитата:
Классно в обще-то!

Хорошо давай по другому.
Твой советник, 32 бита - МТ - как "очистить" память (исходные сохраняются)?
В тестере же память не накапливается.


Это кому вопрос? О каком советнике идет речь?

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 386
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 08.01.16 19:25. Заголовок: Scriptong пишет: О ..


Scriptong пишет:

 цитата:
О каком советнике идет речь?



Речь идет о твоем советнике с оптимизацией.
Оптимизация «сжирает» всю память, т.к. МТ4 32 бита и от компа не зависит.
Надо еще и результат оптимизации сохранить
(ну тут возможно, как-то через Глобальные удастся сохранить).

Scriptong пишет:

 цитата:
Это кому вопрос?



Ну к кому я могу обратиться в разделе Консультации по программированию?
Естественно к тебе Игорь.

Т.к. данный вопрос я поднимал уже и твой взгляд я знаю, то
вопрос тот же, но чуть по другому – меня интересует можно ли это сделать
и каким образом – с чего начать, а пробовать сделать я уж буду сам,
если только это средствами МКЛ.

Я так понимаю вопрос интересует только меня и тратить время на него тебя я не прошу.

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



Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 1997
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 11.01.16 23:30. Заголовок: Balbesik пишет: Реч..


Balbesik пишет:

 цитата:
Речь идет о твоем советнике с оптимизацией.
Оптимизация «сжирает» всю память, т.к. МТ4 32 бита и от компа не зависит.
Надо еще и результат оптимизации сохранить


Ясно.

Balbesik пишет:

 цитата:
Твой советник, 32 бита - МТ - как "очистить" память (исходные сохраняются)?
В тестере же память не накапливается.


В том то и дело, что никак. Из MQL4 невозможно заниматься очисткой памяти. Это все делает сам терминал (тестер, если речь о работе в нем). Но тестер - универсальная штука, которую невозможно использовать наиболее оптимальным образом. А потому тестер во время своей работы не может определить, какие данные в памяти являются лишними, а какие - нет. Вот и держит все это до конца тестирования. Память от предыдущего тестирования освобождается только при выключении тестера стратегий или при начале следующего тестирования.

Выход из ситуации мне видится лишь один, и я о нем тебе говорил еще пару лет назад - уйти от использования вызова индикаторов через iCustom. Именно это является той дорогой составляющей, на которую и тратится 90% памяти. Для этого нужно определиться с кругом используемых индикаторов и включить их в код советника в виде функций. Кроме решения проблем с памятью, это приведет к некоторому росту производительности программы.

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 388
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 12.01.16 22:34. Заголовок: Scriptong пишет: Вы..


Scriptong пишет:

 цитата:
Выход из ситуации.......



Да я это помню.
Вдруг, что-либо новое "проскочило",
по аналогии с FXTFileMaker_AnyData_Script_AD.mq4 -
это вещь!

Возможно на ветке "Ренджей" попробую
сделать простенький алгоритм в виде картинок (не дивер).
Для памяти я уже картинку разместил там -
построение за счет специфики графика.
Если тебе понравится и будет время, то сделаешь
советник для данного форума с вписанным индикатором
в виде отдельной функции (для примера).

А остальное, в зависимости от развития у нас ситуации
с форексом, видимо придется все переделывать под МТ5
для фондовки.
А там "глядишь" может "Хвосты" на 64 переведут МТ4.

Я пока диверы смотрю и все скомпоновать все не соберусь.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2002
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 14.01.16 20:53. Заголовок: Balbesik пишет: Есл..


Balbesik пишет:

 цитата:
Если тебе понравится и будет время


Пока попросту непонятна суть приведенной картинки.

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 389
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 14.01.16 21:27. Заголовок: Scriptong пишет: По..


Scriptong пишет:

 цитата:
Пока попросту непонятна суть приведенной картинки.



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

А так ничего нового - просто за счет ренджей -
корректней работает канал и можно плюсом фильтр -
дивер для достоверности взять.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2005
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 15.01.16 14:33. Заголовок: Balbesik пишет: Сей..


Balbesik пишет:

 цитата:
Сейчас не хочу терять тики - остановить график


Если собираешь тики Alpari, MTraiding или GKFX, то этого можно не делать, т. к. тиковая история для них доступна здесь.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 49 , стр: 1 2 3 4 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  2 час. Хитов сегодня: 1
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет