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



Сообщение: 6
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 16.10.14 08:37. Заголовок: Помогите еще раз дорогой мастер?!


Добрый день уважаемый Игорь! Я еще к вам по просьбу. Короче, есть индикатор корреляции и его коде использован формулу типа FastMA - SlowMA, но я хотел изменить его на FastMA / SlowMA. Сам попробовал но ни как не получилось(в принципе похоже элементарно легкий но у меня не получилось). Пожалуйста, покажите как заменит формулу?!

Вот индикатор: http://file.qip.ru/arch/ZHX5cSTK/Correlations.html или http://qclk.ru/kF/Rm2b

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







Сообщение: 935
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 2
ссылка на сообщение  Отправлено: 09.11.14 16:00. Заголовок: Husanboy пишет: чт..


Husanboy пишет:

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


У функций OrderSend, OrderClose, OrderModify и OrderCloseBy нужно явно указывать последний параметр - arrowColor. По умолчанию он передается как clrNone, т. е. без цвета, что не отображает стрелку.

Например:

 цитата:
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 30, 0, 0, "MySystem", 0, 0, clrBlue);



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



Сообщение: 15
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 09.11.14 16:42. Заголовок: Scriptong пишет: Н..


Scriptong пишет:

 цитата:

Например:

цитата:
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 30, 0, 0, "MySystem", 0, 0, clrBlue);



Понятно, но если я хотел вставить другого вида стрелку например этот советника для открытие arrow code 236 и 238, а для закрытие arrow code 251(я сам добавлял стрелки, но при закрытие появиться редко или не всегда): http://file.qip.ru/arch/Hsajf3xt/MQL4.html

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



Сообщение: 1
Зарегистрирован: 05.12.14
Репутация: 0
ссылка на сообщение  Отправлено: 05.12.14 20:45. Заголовок: помогите пожалуйста ..


помогите пожалуйста сделать так чтоб выводило на экран следующим образом
серия из 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");

Comment(comm+comm1);
}



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





Сообщение: 1035
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 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;

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

ArrayResize(tickets, ordersCnt + 1, 100);
tickets[ordersCnt] = OrderTicket();
ordersCnt++;
}


Этот код собирает тикеты ордеров, принадлежащих текущему символу, в массив tickets с подсчетом количества ордеров (ordersCnt).

Также приведенный код не сможет вывести информацию по нескольким сериям, т. к. постоянно перезаписывается состояние Comment. Вместо:

 цитата:
for(i = 0; i < k; i++)
{
comm = StringConcatenate( "Серия из " , i );
comm1= StringConcatenate( "ордеров = ",seriess[i+1], "\n\r");

Comment(comm+comm1);
}


нужно сделать так:

 цитата:

string comm = "";
for(i = 0; i < k; i++)
comm = comm + "Серия из " , IntegerToString(i) + "ордеров = " + IntegerToString(seriess[i + 1]) + "\n\r");

Comment(comm);



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



Сообщение: 16
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 11.12.14 05:16. Заголовок: Добрый день! Пожалуй..


Добрый день уважаемый Игорь! Пожалуйста помогите с кодам: как сделать динамическое текст уровни индикатора как фибо расширение(во время смешение графика с помощью мишкой направо или налево текст линии(например 61.8...) не исчезает или не перемешается и выглядит как привязанный на Х координату).
Здесь например: имя линии Support 1 привязана постоянное точку и во время смешение графика с помощью мишкой(то есть ручное смешение графика) он не изменяет свои позицию и остается на месту. А я хотел его динамическое движение. Пожалуйста помогите еще раз?!


 цитата:
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
ObjectDelete("S1");
ObjectDelete("S2");
ObjectDelete("S3");
ObjectDelete("R1");
ObjectDelete("R2");
ObjectDelete("R3");
ObjectDelete("PIVIOT");
ObjectDelete("Support 1");
ObjectDelete("Support 2");
ObjectDelete("Support 3");
ObjectDelete("Piviot level");
ObjectDelete("Resistance 1");
ObjectDelete("Resistance 2");
ObjectDelete("Resistance 3");
Comment(" ");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{

//----
double rates[1][6],yesterday_close,yesterday_high,yesterday_low;
ArrayCopyRates(rates, Symbol(), PERIOD_D1);

if(DayOfWeek() == 1)
{
if(TimeDayOfWeek(iTime(Symbol(),PERIOD_D1,1)) == 5)
{
yesterday_close = rates[1][4];
yesterday_high = rates[1][3];
yesterday_low = rates[1][2];
}
else
{
for(int d = 5;d>=0;d--)
{
if(TimeDayOfWeek(iTime(Symbol(),PERIOD_D1,d)) == 5)
{
yesterday_close = rates[d][4];
yesterday_high = rates[d][3];
yesterday_low = rates[d][2];
}

}
}
}
else
{
yesterday_close = rates[1][4];
yesterday_high = rates[1][3];
yesterday_low = rates[1][2];
}


//---- Calculate Pivots

Comment("\nYesterday quotations:\nH ",yesterday_high,"\nL ",yesterday_low, "\nC ",yesterday_close);
double R = yesterday_high - yesterday_low;//range
double p = (yesterday_high + yesterday_low + yesterday_close)/3;// Standard Pivot
double r3 = p + (R * 1.000);
double r2 = p + (R * 0.618);
double r1 = p + (R * 0.382);
double s1 = p - (R * 0.382);
double s2 = p - (R * 0.618);
double s3 = p - (R * 1.000);

drawLine(r3,"R3", Lime,0);
drawLabel("Resistance 3",r3,Lime);
drawLine(r2,"R2", Green,0);
drawLabel("Resistance 2",r2,Green);
drawLine(r1,"R1", DarkGreen,0);
drawLabel("Resistance 1",r1,DarkGreen);

drawLine(p,"PIVIOT",Blue,1);
drawLabel("Piviot level",p,Blue);

drawLine(s1,"S1",Maroon,0);
drawLabel("Support 1",s1,Maroon);
drawLine(s2,"S2",Crimson,0);
drawLabel("Support 2",s2,Crimson);
drawLine(s3,"S3",Red,0);
drawLabel("Support 3",s3,Red);


//----
return(0);
}
//+------------------------------------------------------------------+
void drawLabel(string name,double lvl,color Color)
{
if(ObjectFind(name) != 0)
{
ObjectCreate(name, OBJ_TEXT, 0, Time[10], lvl);
ObjectSetText(name, name, 8, "Arial", EMPTY);
ObjectSet(name, OBJPROP_COLOR, Color);
}
else
{
ObjectMove(name, 0, Time[10], lvl);
}
}


void drawLine(double lvl,string name, color Col,int type)
{
if(ObjectFind(name) != 0)
{
ObjectCreate(name, OBJ_HLINE, 0, Time[0], lvl,Time[0],lvl);

if(type == 1)
ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);
else
ObjectSet(name, OBJPROP_STYLE, STYLE_DOT);

ObjectSet(name, OBJPROP_COLOR, Col);
ObjectSet(name,OBJPROP_WIDTH,1);

}
else
{
ObjectDelete(name);
ObjectCreate(name, OBJ_HLINE, 0, Time[0], lvl,Time[0],lvl);

if(type == 1)
ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);
else
ObjectSet(name, OBJPROP_STYLE, STYLE_DOT);

ObjectSet(name, OBJPROP_COLOR, Col);
ObjectSet(name,OBJPROP_WIDTH,1);

}
}



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





Сообщение: 1043
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 11.12.14 15:32. Заголовок: Husanboy пишет: Зде..


Husanboy пишет:

 цитата:
Здесь например: имя линии Support 1 привязана постоянное точку и во время смешение графика с помощью мишкой(то есть ручное смешение графика) он не изменяет свои позицию и остается на месту. А я хотел его динамическое движение.


Чтобы перемещалась линия в зависимости от текущего положения графика? Это достаточно много нужно изменять, да и непонятно, зачем такой функционал нужен. Еще два года назад такое в принципе невозможно было сделать.

На мой взгляд, лучше использовать отображение уровней Pivot по дням в истории. Так сделано в индикаторе FiboPivot из статьи "Два пути".



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



Сообщение: 17
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 23.12.14 04:36. Заголовок: Чтобы перемещалась ..



 цитата:

Чтобы перемещалась линия в зависимости от текущего положения графика? Это достаточно много нужно изменять, да и непонятно, зачем такой функционал нужен. Еще два года назад такое в принципе невозможно было сделать.

На мой взгляд, лучше использовать отображение уровней Pivot по дням в истории. Так сделано в индикаторе FiboPivot из статьи "Два пути".


Спасибо большое!

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



Сообщение: 18
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 23.12.14 04:41. Заголовок: Добрый день! К вам е..


Добрый день! К вам еще вопрос: как получить нужные данных от истории последних 6 ордеров(нам известно получить от все или последний )? Помогите с кодом?

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





Сообщение: 1063
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 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();
}



Жду дополнительных вопросов, т. к. вряд ли здесь все понятно.
Ну а критерий поиска всегда можно изменить.

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



Сообщение: 19
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 25.12.14 01:01. Заголовок: Добрый вечер! Спасиб..



 цитата:
«Жду дополнительных вопросов, т. к. вряд ли здесь все понятно.
Ну а критерий поиска всегда можно изменить.»


Добрый вечер! Спасибо за отличное объяснение! Вопросу неправильно поставил и могу объяснит подробно: по пересечением индикатора АС входим сделку с обычным лотам и до появление противоположного сигналу открыли и закрыли несколько сделки(Зона А) и по противоположного сигналу закроем все открытых сделки, теперь входим по направлению сигналу но если общий профит все сделки от предыдущие зона А был отрицательный тогда умножаем лот или положительный тогда по обычным лотам. Как получаем эти данные(по зонами)? http://file.qip.ru/photo/3qnpFXd-/eurusdecn-h1-tallinex-limited2.html
Спасибо большое за помощь!!!


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





Сообщение: 1070
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 26.12.14 10:43. Заголовок: Husanboy пишет: Воп..


Husanboy пишет:

 цитата:
Вопросу неправильно поставил и могу объяснит подробно: по пересечением индикатора АС входим сделку с обычным лотам и до появление противоположного сигналу открыли и закрыли несколько сделки(Зона А) и по противоположного сигналу закроем все открытых сделки, теперь входим по направлению сигналу но если общий профит все сделки от предыдущие зона А был отрицательный тогда умножаем лот или положительный тогда по обычным лотам. Как получаем эти данные(по зонами)?


Для этого нужно каким-то образом помечать ордера, которые соответствуют определенной серии ордеров. Я, например, использую для таких целей 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()) в заданном интервале.

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



Сообщение: 20
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 26.12.14 12:07. Заголовок: //+-----------------..


Добрый день! Спасибо за ответы! Вот приложил вес код. Попробовал разные варианты типа по вашему примеру, но все равно работает не правильно(умножение лота при убытки серии ордеров от предыдущие зону). Пожалуйста, помогите сделать этот код работоспособный?!


 цитата:
#property version "1.00"
#property strict
input string Indicator_Parameters_______="_";//Indicator Parameters
// Параметры индикатора Стрелки и Линии
input string AC_________________________="----";//Indicator Accelerator Oscillator
input double BuyLine = 0.0002;//AC Buy Line
input double SellLine = -0.0002;//AC Sell Line
input string Trade_Parameters___________="__";//Trade Parameters
input int DistanceOrders = 10;//Distance for Open Price
input string BuyOrders__________________="----";//BuyStop Settings
input double TakeProfit1 = 10;//Take Profit 1
input double TakeProfit2 = 20;//Take Profit 2
input double TakeProfit3 = 0;//Take Profit 3
input double StopLossBuy = 0;//Stop Loss
input string SellOrders_________________="------";//SellStop Settings
input double TakeProfit11 = 10;//Take Profit 1
input double TakeProfit22 = 20;//Take Profit 2
input double TakeProfit33 = 0;//Take Profit 3
input double StopLossSell = 0;//Stop Loss
input int MaxOpenOrders = 6;//Max Open Orders
input string Lot_Parameters_____________="-----";//Lot Parameters
input double FixedLots = 0.1;//Lot
input bool Martingale = true;//Martingale
input double MultiplierLot = 2;//Lot Multiplier
input int Slippage = 3;
input string NameEA = "EA";
input int MAGIC_NUM = 123;//MAGIC NUMBER
//=================================================//
double Lots;double SlossB,SlossS,lot
,Tprof1,Tprof2,Tprof3,Tprof11,Tprof22,
Tprof33;bool Buy = false, Sell = false;
int PipValue = 1;double ClosingArray[100];
double LastLot=0,div=1;int deposit=0;
int kesishma;double Drawdown;int sp=0,P=0;
datetime LastOrderHTime=0,LastOrderTime=0;
double EntryPriceBuy,EntryPriceSell;
double AllProfit=0;bool Buy1 = false,
Sell1 = false;int LastOrderTicket;
datetime LastOrderTimeBuy=0,LastOrderTimeSell=0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
if (Digits == 3 || Digits == 5){ PipValue = 10;
}
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{return(0);}

//+------------------------------------------------------------------+
//| Получение сигналов на покупку и продажу |
//+------------------------------------------------------------------+
void Indicators()
{
Buy = (iAC(NULL,0,2) < BuyLine && iAC(NULL,0,1) > BuyLine);
Sell = (iAC(NULL,0,2) > SellLine && iAC(NULL,0,1) < SellLine);
Buy1 = (iAC(NULL,0,1) > BuyLine);
Sell1 = (iAC(NULL,0,1) < SellLine);
}
//+-----------------------------------------------------------------//
double FindLastOrderParameter(int mNumber, string ParamName)
{
int mOrderTicket = 0; double mOrderPrice = 0;
double mOrderLot = 0; double mOrderProfit = 0;
int PrevTicket = 0; int CurrTicket = 0;

for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == mNumber)
{
CurrTicket = OrderTicket();
if(CurrTicket > PrevTicket)
{
PrevTicket = CurrTicket;
mOrderPrice = OrderOpenPrice();
mOrderTicket = OrderTicket();
mOrderLot = OrderLots();
mOrderProfit = OrderProfit() + OrderSwap() + OrderCommission();
}
}
if(ParamName == "price") return(mOrderPrice);
else if(ParamName == "ticket") return(mOrderTicket);
else if(ParamName == "lot") return(mOrderLot);
else if(ParamName == "profit") return(mOrderProfit);
return(0);
}
//+-------------------------------------------------------------------------------------------------//
datetime FindLastHistoryOrderParameter(int mNumber, string ParamName)
{
datetime mOrderTime = 0;int PrevTicket = 0; int CurrTicket = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
CurrTicket = OrderTicket();
if(CurrTicket > PrevTicket)
{
PrevTicket = CurrTicket;
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Error in history!"); break;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;

mOrderTime = OrderOpenTime();
}
}
if(ParamName == "time") return(mOrderTime);
return(0);
}
//+-----------------------------------------------------------------------------------------------------------------------+
//| Вывод предупреждения об отправке ордера |
//+-----------------------------------------------------------------------------------------------------------------------+
void prtAlert(string str = "")
{
Print(str);
Alert(str);
}
//+------------------------------------------------------------------+
//| Расчет размера ордера |
//+------------------------------------------------------------------+
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);

AllProfit = CheckTotalProfitHistory(); LastLot = CheckLastLotHistory();
if(Martingale && AllProfit < 0){ Lots=NormalizeDouble(LastLot * MultiplierLot, 2);}
}
//+------------------------------------------------------------------+
double CheckLastLotHistory()
{
double Llot=0; int df = OrdersHistoryTotal()-1;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC_NUM )
{
Llot=OrderLots();
}
}}
return(Llot);
}
//+------------------------------------------------------------------+
//| History Total Profit |
//+------------------------------------------------------------------+
double CheckTotalProfitHistory()
{
double Profit=0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC_NUM)
{
if(buy != 0 && LastOrderTimeSell <= OrderOpenTime()){
Profit+=OrderProfit();}
if(sell != 0 && LastOrderTimeBuy <= OrderOpenTime()){
Profit+=OrderProfit();}
}}}
return(Profit);
}

//+------------------------------------------------------------------+
void CloseOrders()
{
for( int i = 0; i < OrdersTotal(); i++)
{
bool Os = OrderSelect(i,SELECT_BY_POS);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC_NUM)
{
if( Sell && OrderComment()== NameEA+(string)1)
{
CloseAll();
}
if( Buy && OrderComment()== NameEA)
{
CloseAll();}}
}
}
//+------------------------------------------------------------------+
//| CloseAll |
//+------------------------------------------------------------------+
int CloseAll()
{
int i=OrdersTotal()-1;
for(i=OrdersTotal()-1;i>=0;i--)
{
int os = OrderSelect(i,SELECT_BY_POS);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC_NUM)
{
if(OrderType()==OP_BUY)
int oc = OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(Symbol(),MODE_BID),
(int)MarketInfo(Symbol(),MODE_DIGITS)),1000,Gold);
if(OrderType()==OP_SELL)
int oc = OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),
(int)MarketInfo(Symbol(),MODE_DIGITS)),1000,Gold);
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL)
int od = OrderDelete(OrderTicket());
int x=0; for(x=0;x<100;x++)
{
if(ClosingArray[x]==0)
{
ClosingArray[x]=OrderTicket();
break; } } } } return(1);}
//CloseAll --------------------------------------------------------END
void OpenOrder()
{
int totalOrders = OrdersTotal(),numPos = 0,numPosb = 0 ,numPosss = 0
,numPosbb = 0, numPoss = 0;totalOrders = OrdersTotal(); numPos = 0;

for(int i = 0; i < totalOrders; i++)
{
int OrSel = OrderSelect(i, SELECT_BY_POS);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC_NUM)
{
numPos++;
if(OrderType()== OP_BUYSTOP){ numPosb++;}
if(OrderType()== OP_SELLSTOP){ numPoss++;}
if(OrderType()== OP_BUY){ numPosbb++;}
if(OrderType()== OP_SELL){ numPosss++;}
}
}
if(numPos < 6)
{
if( Buy && LastOrderTimeBuy==0){
EntryPriceBuy = iOpen(NULL,0,0) + DistanceOrders * PipValue * Point;buy=1;
EntryPriceSell = iOpen(NULL,0,0) - DistanceOrders * PipValue * Point;sell=0;
LastOrderTime=iTime(NULL,0,0);lot=Lots;LastOrderTimeBuy=iTime(NULL,0,0);LastOrderTimeSell=0;
}
if( Sell && LastOrderTimeSell==0){
EntryPriceBuy = iOpen(NULL,0,0) + DistanceOrders * PipValue * Point;buy=0;
EntryPriceSell = iOpen(NULL,0,0) - DistanceOrders * PipValue * Point;sell=2;
LastOrderTime=iTime(NULL,0,0);lot=Lots;LastOrderTimeSell=iTime(NULL,0,0);LastOrderTimeBuy=0;
}
if( LastOrderTimeBuy!=0 && LastOrderTimeSell==0 )
{
if( numPosb < 1 && numPosbb < 1){

if(StopLossBuy == 0){SlossB = EntryPriceSell;} else{
SlossB = EntryPriceBuy - StopLossBuy* PipValue * Point;}
if(TakeProfit1 == 0){Tprof1 = 0;}else{
Tprof1 = EntryPriceBuy + TakeProfit1* PipValue * Point;}
if(TakeProfit2 == 0){Tprof2 = 0;}else{
Tprof2 = EntryPriceBuy + TakeProfit2* PipValue * Point;}
if(TakeProfit3 == 0){Tprof3 = 0;}else{
Tprof3 = EntryPriceBuy + TakeProfit3* PipValue * Point;}

bool Tiket= OrderSend(Symbol(), OP_BUYSTOP, lot, EntryPriceBuy, 3, SlossB, Tprof1, NameEA+(string)1 ,MAGIC_NUM, 0, Green);
Tiket= OrderSend(Symbol(), OP_BUYSTOP, lot, EntryPriceBuy, 3, SlossB, Tprof2, NameEA+(string)1 ,MAGIC_NUM, 0, Green);
Tiket= OrderSend(Symbol(), OP_BUYSTOP, lot, EntryPriceBuy, 3, SlossB, Tprof3, NameEA+(string)1,MAGIC_NUM, 0, Green);}
if( numPoss < 1 && numPosss < 1){

if(StopLossSell == 0){SlossS = EntryPriceBuy;} else{
SlossS = EntryPriceSell + StopLossSell * PipValue * Point;}
if(TakeProfit11 == 0){Tprof11 = 0;}else{
Tprof11 = EntryPriceSell - TakeProfit11* PipValue * Point;}
if(TakeProfit22 == 0){Tprof22 = 0;}else{
Tprof22 = EntryPriceSell - TakeProfit22* PipValue * Point;}
if(TakeProfit33 == 0){Tprof33 = 0;}else{
Tprof33 = EntryPriceSell - TakeProfit33* PipValue * Point;}

bool Tiket= OrderSend(Symbol(), OP_SELLSTOP, lot, EntryPriceSell, 3, SlossS, Tprof11, NameEA+(string)1 ,MAGIC_NUM, 0, Red);
Tiket= OrderSend(Symbol(), OP_SELLSTOP, lot, EntryPriceSell, 3, SlossS, Tprof22, NameEA+(string)1 ,MAGIC_NUM, 0, Red);
Tiket= OrderSend(Symbol(), OP_SELLSTOP, lot, EntryPriceSell, 3, SlossS, Tprof33, NameEA+(string)1 ,MAGIC_NUM, 0, Red);}

}
if( LastOrderTimeBuy==0 && LastOrderTimeSell!=0 )
{
if( numPosb < 1 && numPosbb < 1){

if(StopLossBuy == 0){SlossB = EntryPriceSell;} else{
SlossB = EntryPriceBuy - StopLossBuy* PipValue * Point;}
if(TakeProfit1 == 0){Tprof1 = 0;}else{
Tprof1 = EntryPriceBuy + TakeProfit1* PipValue * Point;}
if(TakeProfit2 == 0){Tprof2 = 0;}else{
Tprof2 = EntryPriceBuy + TakeProfit2* PipValue * Point;}
if(TakeProfit3 == 0){Tprof3 = 0;}else{
Tprof3 = EntryPriceBuy + TakeProfit3* PipValue * Point;}

bool Tiket= OrderSend(Symbol(), OP_BUYSTOP, lot, EntryPriceBuy, 3, SlossB, Tprof1, NameEA ,MAGIC_NUM, 0, Green);
Tiket= OrderSend(Symbol(), OP_BUYSTOP, lot, EntryPriceBuy, 3, SlossB, Tprof2, NameEA ,MAGIC_NUM, 0, Green);
Tiket= OrderSend(Symbol(), OP_BUYSTOP, lot, EntryPriceBuy, 3, SlossB, Tprof3, NameEA ,MAGIC_NUM, 0, Green);}

if( numPoss < 1 && numPosss < 1){

if(StopLossSell == 0){SlossS = EntryPriceBuy;} else{
SlossS = EntryPriceSell + StopLossSell * PipValue * Point;}
if(TakeProfit11 == 0){Tprof11 = 0;}else{
Tprof11 = EntryPriceSell - TakeProfit11* PipValue * Point;}
if(TakeProfit22 == 0){Tprof22 = 0;}else{
Tprof22 = EntryPriceSell - TakeProfit22* PipValue * Point;}
if(TakeProfit33 == 0){Tprof33 = 0;}else{
Tprof33 = EntryPriceSell - TakeProfit33* PipValue * Point;}

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);
}
//+---------------------------------------------------------------------------------//




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



Сообщение: 21
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 30.12.14 05:44. Заголовок: Добрый день! Обновле..


Добрый день! Обновлен код(предыдущие поста). Пожалуйста, помогите?!

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





Сообщение: 1071
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 30.12.14 17:54. Заголовок: Добрый день. Пожалу..


Добрый день.

Пожалуйста, большие коды прикрепляйте в виде файла (например, разместите его на dropmefiles.com, а здесь оставьте ссылку).
В том коде, что Вы привели, достаточно много очевидных ошибок (их я исправил). Но даже после исправления код не компилируется - отсутствует объявление переменных buy и sell. Исправить не могу, т. к. не понимаю, зачем эти переменные нужны сами по себе. Если же в коде опечатка, то ее нужно исправить только Вам. Догадаться, где именно эта опечатка, я не могу.

Итак, вот файл кода, исправленный и приведенный мною в удобочитаемый вид. Определите в нем, где именно опечатка или где именно должны быть объявлены переменные.
Ну и чтобы я смог помочь Вам, укажите четко, в чем именно заключается проблема: как должен работать эксперт и как он работает сейчас (в чем именно неправильность заключается).



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



Сообщение: 22
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 30.12.14 20:54. Заголовок: Добрый вечер! Спасиб..


Добрый вечер! Спасибо за ответь! Тогда начнем: каждый раз по пересечением АС на 0,0002(или -0,0002) линии открывается серии ордеров и это бывает начала торговый зону(например зона А). После обратным пересечение АС закрывается все(открытый и отложенный) ордеры и это конца торговый зону. Далее если общий прибил от предыдущие зону положительный тогда следующие серии ордеров для зону(В) открывается с обычным лотам, а если прибыл был отрицательный, тогда умножаем лот вдвое. Короче, использовать мартингейл по прибылью серии ордеров от предыдущие зону. Я уже сделал все необходимые, но умножение лота при убытки предыдущие зону работает не точно. По моему теперь немного понятно. Пожалуйста, помогите?!!! Спасибо заранее!!!
Вот советник: http://dropmefiles.com/YxvHA


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

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