Форум » Консультации по программированию » Помогите еще раз дорогой мастер?! » Ответить

Помогите еще раз дорогой мастер?!

Husanboy: Добрый день уважаемый Игорь! Я еще к вам по просьбу. Короче, есть индикатор корреляции и его коде использован формулу типа FastMA - SlowMA, но я хотел изменить его на FastMA / SlowMA. Сам попробовал но ни как не получилось(в принципе похоже элементарно легкий но у меня не получилось). Пожалуйста, покажите как заменит формулу?! Вот индикатор: http://file.qip.ru/arch/ZHX5cSTK/Correlations.html или http://qclk.ru/kF/Rm2b

Ответов - 61, стр: 1 2 3 4 5 All

Scriptong: Husanboy пишет: чтобы закрытие сделок при работе на реальных счетах отображалось так же, как при визуальном тестировании (стрелками и пунктиром, соединяющим точки открытия и закрытия ордеров)? У функций OrderSend, OrderClose, OrderModify и OrderCloseBy нужно явно указывать последний параметр - arrowColor. По умолчанию он передается как clrNone, т. е. без цвета, что не отображает стрелку. Например: OrderSend(Symbol(), OP_BUY, 0.1, Ask, 30, 0, 0, "MySystem", 0, 0, clrBlue);

Husanboy: 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

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


Scriptong: Добрый день. 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);

Husanboy: Добрый день уважаемый Игорь! Пожалуйста помогите с кодам: как сделать динамическое текст уровни индикатора как фибо расширение(во время смешение графика с помощью мишкой направо или налево текст линии(например 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); } }

Scriptong: Husanboy пишет: Здесь например: имя линии Support 1 привязана постоянное точку и во время смешение графика с помощью мишкой(то есть ручное смешение графика) он не изменяет свои позицию и остается на месту. А я хотел его динамическое движение. Чтобы перемещалась линия в зависимости от текущего положения графика? Это достаточно много нужно изменять, да и непонятно, зачем такой функционал нужен. Еще два года назад такое в принципе невозможно было сделать. На мой взгляд, лучше использовать отображение уровней Pivot по дням в истории. Так сделано в индикаторе FiboPivot из статьи "Два пути".

Husanboy: Чтобы перемещалась линия в зависимости от текущего положения графика? Это достаточно много нужно изменять, да и непонятно, зачем такой функционал нужен. Еще два года назад такое в принципе невозможно было сделать. На мой взгляд, лучше использовать отображение уровней Pivot по дням в истории. Так сделано в индикаторе FiboPivot из статьи "Два пути". Спасибо большое!

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

Scriptong: Если под последними ордерами имеются в виду последние шесть ордеров по времени закрытия (а не по какому-то другому критерию), то сделать нужно следующим образом. 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(); } Жду дополнительных вопросов, т. к. вряд ли здесь все понятно. Ну а критерий поиска всегда можно изменить.

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

Scriptong: 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()) в заданном интервале.

Husanboy: Добрый день! Спасибо за ответы! Вот приложил вес код. Попробовал разные варианты типа по вашему примеру, но все равно работает не правильно(умножение лота при убытки серии ордеров от предыдущие зону). Пожалуйста, помогите сделать этот код работоспособный?! #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); } //+---------------------------------------------------------------------------------//

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

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

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



полная версия страницы