Отправлено: 16.10.14 08:37. Заголовок: Помогите еще раз дорогой мастер?!
Добрый день уважаемый Игорь! Я еще к вам по просьбу. Короче, есть индикатор корреляции и его коде использован формулу типа FastMA - SlowMA, но я хотел изменить его на FastMA / SlowMA. Сам попробовал но ни как не получилось(в принципе похоже элементарно легкий но у меня не получилось). Пожалуйста, покажите как заменит формулу?!
чтобы закрытие сделок при работе на реальных счетах отображалось так же, как при визуальном тестировании (стрелками и пунктиром, соединяющим точки открытия и закрытия ордеров)?
У функций OrderSend, OrderClose, OrderModify и OrderCloseBy нужно явно указывать последний параметр - arrowColor. По умолчанию он передается как clrNone, т. е. без цвета, что не отображает стрелку.
Понятно, но если я хотел вставить другого вида стрелку например этот советника для открытие arrow code 236 и 238, а для закрытие arrow code 251(я сам добавлял стрелки, но при закрытие появиться редко или не всегда): http://file.qip.ru/arch/Hsajf3xt/MQL4.html
помогите пожалуйста сделать так чтоб выводило на экран следующим образом серия из 1-го ордера = 1 серия из 2-х ордеров = 7 серия из 3-х ордеров = 4 серия из 4-х ордеров = 9 ........ ......... серия из N ордеров = 3 и чтоб размер массива увеличивался от размера count так как зарание количество серий неизвестно
цитата:
ushort seriess[];
ushort series_current = 0; input int magic=345461; int NumberOfPositions(string sy="" , int mn=-1) { int i, k=OrdersTotal(), kp=0;
if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if(mn<0|| OrderMagicNumber()==magic) kp++; } } } } return(kp); } void OnTick() { int count = NumberOfPositions(Symbol(),-1); if(count == 0) series_current = 0; if(series_current != count) { series_current = (ushort)count; if(count == 1) seriess[0]++; if(count > 1) { seriess[count-1]++; seriess[count-2]--; } } int i; int k=12; string comm; string comm1;
for(i = 0; i < k; i++){ comm = StringConcatenate( "Серия из " , i ); comm1= StringConcatenate( "ордеров = ",seriess[i+1], "\n\r");
Отправлено: 06.12.14 15:32. Заголовок: Добрый день. max020..
Добрый день.
max020780 пишет:
цитата:
помогите пожалуйста сделать так чтоб выводило на экран следующим образом серия из 1-го ордера = 1 серия из 2-х ордеров = 7 серия из 3-х ордеров = 4 серия из 4-х ордеров = 9
Пока из приведенного кода неясно, каким образом идентифицируются серии ордеров. К примеру, может быть идентификация по символу (но в коде используется только один символ - текущий), по типам ордеров, по MagicNumber, по интервалу времени открытия и т. д. Таким образом, нужно сначала определиться с тем, что подразумевается под термином "серия".
max020780 пишет:
цитата:
и чтоб размер массива увеличивался от размера count так как зарание количество серий неизвестно
Для этого делается именно так, как Вы и сделали - объявляется динамический массив. Только этот массив у Вас не изменяет свой размер в дальнейшем, что приведет к фатальной ошибке - выход за пределы массива. Изменяются размеры массива следующим образом:
цитата:
int tickets[]; int ordersCnt = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--) { if (!OrderSelect(i, SELECT_BY_POS)) continue;
Добрый день уважаемый Игорь! Пожалуйста помогите с кодам: как сделать динамическое текст уровни индикатора как фибо расширение(во время смешение графика с помощью мишкой направо или налево текст линии(например 61.8...) не исчезает или не перемешается и выглядит как привязанный на Х координату). Здесь например: имя линии Support 1 привязана постоянное точку и во время смешение графика с помощью мишкой(то есть ручное смешение графика) он не изменяет свои позицию и остается на месту. А я хотел его динамическое движение. Пожалуйста помогите еще раз?!
Здесь например: имя линии Support 1 привязана постоянное точку и во время смешение графика с помощью мишкой(то есть ручное смешение графика) он не изменяет свои позицию и остается на месту. А я хотел его динамическое движение.
Чтобы перемещалась линия в зависимости от текущего положения графика? Это достаточно много нужно изменять, да и непонятно, зачем такой функционал нужен. Еще два года назад такое в принципе невозможно было сделать.
На мой взгляд, лучше использовать отображение уровней Pivot по дням в истории. Так сделано в индикаторе FiboPivot из статьи "Два пути".
Отправлено: 23.12.14 04:36. Заголовок: Чтобы перемещалась ..
цитата:
Чтобы перемещалась линия в зависимости от текущего положения графика? Это достаточно много нужно изменять, да и непонятно, зачем такой функционал нужен. Еще два года назад такое в принципе невозможно было сделать.
На мой взгляд, лучше использовать отображение уровней Pivot по дням в истории. Так сделано в индикаторе FiboPivot из статьи "Два пути".
Отправлено: 23.12.14 04:41. Заголовок: Добрый день! К вам е..
Добрый день! К вам еще вопрос: как получить нужные данных от истории последних 6 ордеров(нам известно получить от все или последний )? Помогите с кодом?
Отправлено: 23.12.14 19:33. Заголовок: Если под последними ..
Если под последними ордерами имеются в виду последние шесть ордеров по времени закрытия (а не по какому-то другому критерию), то сделать нужно следующим образом.
1. На глобальном уровне объявляется структура и именованная константа, указывающая количество искомых ордеров:
цитата:
struct OrderInfo { int ticket; datetime closeTime;
OrderInfo() { ticket = -1; closeTime = 0; } };
#define MAX_ORDERS 6
2. Функция поиска ордеров с выдачей результата:
цитата:
// Инициализация массива, собирающего данные о последних шести ордерах OrderInfo orderInfo[MAX_ORDERS];
// Просмотр истории счета for (int i = OrdersHistoryTotal() - 1; i >= 0; i--) { if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if (OrderCloseTime() <= orderInfo[MAX_ORDERS - 1].closeTime) continue;
InsertOrderData(orderInfo); }
// Вывод данных об ордерах Print("=========== Информация о ", MAX_ORDERS, " последних закрытых ордерах ===================="); for (int i = MAX_ORDERS - 1; i >= 0; i--) { if (!OrderSelect(orderInfo[ i ].ticket, SELECT_BY_TICKET)) continue;
OrderPrint(); } Print("=========== Конец информации о ", MAX_ORDERS, " последних закрытых ордерах ====================");
3. Функция вставки в массив данных о новом ордере:
цитата:
void InsertOrderData(OrderInfo &orderInfo[]) { // Поиск индекса элемента массива, в который необходимо вставить данные об ордере int i = MAX_ORDERS - 2; for (; i >= 0; i--) if (OrderCloseTime() <= orderInfo[ i ].closeTime) break;
// Вставка будет произведена по следующему, после найденного, индекса i++;
// Сдвиг данных об ордерах на один элемент вниз с целью освобождения места для вставки for (int k = MAX_ORDERS - 1; k > i; k--) orderInfo[k] = orderInfo[k - 1];
// Вставка новых данных orderInfo[ i ].ticket = OrderTicket(); orderInfo[ i ].closeTime = OrderCloseTime(); }
Жду дополнительных вопросов, т. к. вряд ли здесь все понятно. Ну а критерий поиска всегда можно изменить.
«Жду дополнительных вопросов, т. к. вряд ли здесь все понятно. Ну а критерий поиска всегда можно изменить.»
Добрый вечер! Спасибо за отличное объяснение! Вопросу неправильно поставил и могу объяснит подробно: по пересечением индикатора АС входим сделку с обычным лотам и до появление противоположного сигналу открыли и закрыли несколько сделки(Зона А) и по противоположного сигналу закроем все открытых сделки, теперь входим по направлению сигналу но если общий профит все сделки от предыдущие зона А был отрицательный тогда умножаем лот или положительный тогда по обычным лотам. Как получаем эти данные(по зонами)? http://file.qip.ru/photo/3qnpFXd-/eurusdecn-h1-tallinex-limited2.html Спасибо большое за помощь!!!
Вопросу неправильно поставил и могу объяснит подробно: по пересечением индикатора АС входим сделку с обычным лотам и до появление противоположного сигналу открыли и закрыли несколько сделки(Зона А) и по противоположного сигналу закроем все открытых сделки, теперь входим по направлению сигналу но если общий профит все сделки от предыдущие зона А был отрицательный тогда умножаем лот или положительный тогда по обычным лотам. Как получаем эти данные(по зонами)?
Для этого нужно каким-то образом помечать ордера, которые соответствуют определенной серии ордеров. Я, например, использую для таких целей Magic Number. В нем кумулятивно записываются данные об идентификаторе ордеров эксперта, номере серии и номере ордера в серии:
цитата:
#define MAX_ORDERS_IN_SERIES 1000 // Максимальное количество ордеров одного направления, поддерживаемое экспертом #define SERIES_RANK 10 // Максимальное количество серий, поддерживаемое советником #define MAGICNUMBER_MUL (int)(MAX_ORDERS_IN_SERIES * SERIES_RANK) // Множитель ID ордеров эксперта
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ //| Синтез значения Magic Number | //+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ int GetMagicNumber(int id, int masterSign, int seriesIndex, int orderIndex) { return id * MAGICNUMBER_MUL + seriesIndex * MAX_ORDERS_IN_SERIES + orderIndex; } //+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ //| Анализ значения Magic Number | //+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ int GetOrderIndexAndIDMasterSeries(int mn, int &id, int &seriesIndex) { id = mn / MAGICNUMBER_MUL; int residue = mn % MAGICNUMBER_MUL;
seriesIndex = residue / MAX_ORDERS_IN_SERIES;
return residue % MAX_ORDERS_IN_SERIES; }
Когда ордера пронумерованы подобным образом, то дальнейшая их идентификация в истории счета или среди рабочих ордеров становится возможной.
Так, если указанной Вами зоне А соответствуют сделки серии с индексом 1, то выделяете из истории счета все ордера с таким индексом серии, по всем ним складываете результат (OrderProfit() + OrderSwap() + OrderComission()). Также можно обойтись без номеров серии (но Magic Number в любом случае нужен, чтобы отличать "свои" ордера от "чужих"). Такое возможно, если известен интервал действия зоны А. Например, если зона А началась на свече 2014.11.14 17:00, а закончилась на свече 2014.11.17 07:00, то нужно выбрать из истории счета все ордера, которые открылись (OrderOpenTime()) и закрылись (OrderCloseTime()) в заданном интервале.
Добрый день! Спасибо за ответы! Вот приложил вес код. Попробовал разные варианты типа по вашему примеру, но все равно работает не правильно(умножение лота при убытки серии ордеров от предыдущие зону). Пожалуйста, помогите сделать этот код работоспособный?!
bool Tiket= OrderSend(Symbol(), OP_SELLSTOP, lot, EntryPriceSell, 3, SlossS, Tprof11, NameEA ,MAGIC_NUM, 0, Red); Tiket= OrderSend(Symbol(), OP_SELLSTOP, lot, EntryPriceSell, 3, SlossS, Tprof22, NameEA ,MAGIC_NUM, 0, Red); Tiket= OrderSend(Symbol(), OP_SELLSTOP, lot, EntryPriceSell, 3, SlossS, Tprof33, NameEA ,MAGIC_NUM, 0, Red);} } } } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if(Bars < 3){ Print("Not enough bars for this strategy - ", NameEA); return(-1); } Indicators(); OpenOrder(); LotsSize();int totalOrders = OrdersTotal(); int numPos = 0,numPosb = 0,numPoss = 0;bool ban = false; bool band = false;bool bandit = false; /*DeleteOrders();*/CloseOrders(); for(int i = OrdersTotal() - 1; i >= 0; i--) if (OrderSelect (i, SELECT_BY_POS)) { // если на свече уже есть открытый ордер, ставим запрет if ( OrderOpenTime() >= Time[0] ) ban = true; } if ( ban ){ return(0);}
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 ( OrderOpenTime() >= Time[0] ) band = true; } if ( band ){ return(0);}
for( int i = 0; i < totalOrders; i++) { int OrSel = OrderSelect(i, SELECT_BY_POS); if(OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC_NUM) { numPos++; if (OrderProfit()<0){ Drawdown = OrderProfit()*100/AccountBalance(); } } } return(0); } //+---------------------------------------------------------------------------------//
Отправлено: 30.12.14 17:54. Заголовок: Добрый день. Пожалу..
Добрый день.
Пожалуйста, большие коды прикрепляйте в виде файла (например, разместите его на dropmefiles.com, а здесь оставьте ссылку). В том коде, что Вы привели, достаточно много очевидных ошибок (их я исправил). Но даже после исправления код не компилируется - отсутствует объявление переменных buy и sell. Исправить не могу, т. к. не понимаю, зачем эти переменные нужны сами по себе. Если же в коде опечатка, то ее нужно исправить только Вам. Догадаться, где именно эта опечатка, я не могу.
Итак, вот файл кода, исправленный и приведенный мною в удобочитаемый вид. Определите в нем, где именно опечатка или где именно должны быть объявлены переменные. Ну и чтобы я смог помочь Вам, укажите четко, в чем именно заключается проблема: как должен работать эксперт и как он работает сейчас (в чем именно неправильность заключается).
Добрый вечер! Спасибо за ответь! Тогда начнем: каждый раз по пересечением АС на 0,0002(или -0,0002) линии открывается серии ордеров и это бывает начала торговый зону(например зона А). После обратным пересечение АС закрывается все(открытый и отложенный) ордеры и это конца торговый зону. Далее если общий прибил от предыдущие зону положительный тогда следующие серии ордеров для зону(В) открывается с обычным лотам, а если прибыл был отрицательный, тогда умножаем лот вдвое. Короче, использовать мартингейл по прибылью серии ордеров от предыдущие зону. Я уже сделал все необходимые, но умножение лота при убытки предыдущие зону работает не точно. По моему теперь немного понятно. Пожалуйста, помогите?!!! Спасибо заранее!!! Вот советник: http://dropmefiles.com/YxvHA
Все даты в формате GMT
2 час. Хитов сегодня: 0
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет