Rigal Опубликовано 4 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 4 декабря, 2023 Только что, Lexa000 сказал: Уважаемый Rigal, помогите отредактировать этот код для одного символа, а не для всех //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- if(OrdersTotal() < 3) { if(Open[1]<Close[0]) { if(DistMarketAndPos(NULL,OP_BUY,Magic)>10) // Дистанция > 10 пунктов { OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,"Trend Long",Magic,0,Blue); } } } //---- return(0); } //+------------------------------------------------------------------+ //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает расстояние в пунктах между рынком и ближайшей | //| позицей | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| op - торговая операция ( -1 - любая позиция) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ int DistMarketAndPos(string sy="", int op=-1, int mn=-1) { double d, p; int i, k=OrdersTotal(), r=1000000; if (sy=="" || sy=="0") sy=Symbol(); p=MarketInfo(sy, MODE_POINT); if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01; for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) { if (mn<0 || OrderMagicNumber()==mn) { if (OrderType()==OP_BUY) { d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p; if (r>d) r=NormalizeDouble(d, 0); } if (OrderType()==OP_SELL) { d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p; if (r>d) r=NormalizeDouble(d, 0); } } } } } return(r); } Простите, я не понимаю, чего вы хотите. Сформулируйте внимательнее, пожалуйста. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 4 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 4 декабря, 2023 3 минуты назад, Rigal сказал: Простите, я не понимаю, чего вы хотите. Сформулируйте внимательнее, пожалуйста. Строчка if(OrdersTotal() < 3) Читает количество открытых ордеров по всем символам, а нужно, чтобы читал по одному. Как это сделать? Изменено 4 декабря, 2023 пользователем Lexa000 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 4 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 4 декабря, 2023 28 минут назад, Lexa000 сказал: Строчка if(OrdersTotal() < 3) Читает количество открытых ордеров по всем символам, а нужно, чтобы читал по одному. Как это сделать? Вы, вероятно, хотите что-то вроде: extern int Magic = 123; extern double Lots = 0.01; extern int SL = 10; extern int TP = 10; void start() { int count[] = {0, 0}; int distanceToBestPosition[] = {INT_MAX, INT_MAX}; for(int i = OrdersTotal()-1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() <= OP_SELL) { count[OrderType()]++; int distance = (OrderType() == OP_BUY ? OrderOpenPrice() - MarketInfo(Symbol(), MODE_ASK) : MarketInfo(Symbol(), MODE_BID - OrderOpenPrice())) / Point(); if(distance < distanceToBestPosition[OrderType()]) distanceToBestPosition[OrderType()] = distance; } } //проверим условие на покупку if(count[OP_BUY] > 3 && distanceToBestPosition[OP_BUY] > 10) OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue); //проверим условие на продажу if(count[OP_SELL] > 3 && distanceToBestPosition[OP_SELL] > 10) OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed); } Я здесь поменял довольно много: например, дистанция может быть положительная (это дистанция против позиции, когда вы хотите усредниться), или отрицательная (когда ваша лучшая позиция в прибыли). В исходной функции Кима вычисляется абсолютная величина - то есть ваше условие выполнится и в случае, когда ближайшая позиция в профите на десять пунктов. Мне почему-то кажется, что вы пытаетесь все же дистанцию использовать для усреднения. Если это не так и вы действительно хотите просто абсолютную дистанцию до ближайшей позиции, то код получится вот такой: extern int Magic = 123; extern double Lots = 0.01; extern int SL = 10; extern int TP = 10; void start() { int count[] = {0, 0}; int nearestDistance[] = {INT_MAX, INT_MAX}; for(int i = OrdersTotal()-1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() <= OP_SELL) { count[OrderType()]++; int distance = MathAbs(OrderOpenPrice() - (OrderType() == OP_BUY ? Ask : Bid) / Point(); if(distance < nearestDistance[OrderType()]) nearestDistance[OrderType()] = distance; } } // if(count[OP_BUY] > 3 && nearestDistance[OP_BUY] > 10) OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue); // if(count[OP_SELL] > 3 && nearestDistance[OP_SELL] > 10) OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed); } Изменено 4 декабря, 2023 пользователем Rigal 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 4 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 4 декабря, 2023 11 минут назад, Rigal сказал: Вы, вероятно, хотите что-то вроде: extern int Magic = 123; extern double Lots = 0.01; extern int SL = 10; extern int TP = 10; void start() { int count[] = {0, 0}; int distanceToBestPosition[] = {INT_MAX, INT_MAX}; for(int i = OrdersTotal()-1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() <= OP_SELL) { count[OrderType()]++; int distance = (OrderType() == OP_BUY ? OrderOpenPrice() - MarketInfo(Symbol(), MODE_ASK) : MarketInfo(Symbol(), MODE_BID - OrderOpenPrice())) / Point(); if(distance < distanceToBestPosition[OrderType()]) distanceToBestPosition[OrderType()] = distance; } } //проверим условие на покупку if(count[OP_BUY] > 3 && distanceToBestPosition[OP_BUY] > 10) OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue); //проверим условие на продажу if(count[OP_SELL] > 3 && distanceToBestPosition[OP_SELL] > 10) OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed); } Я здесь поменял довольно много: например, дистанция может быть положительная (это дистанция против позиции, когда вы хотите усредниться), или отрицательная (когда ваша лучшая позиция в прибыли). В исходной функции Кима вычисляется абсолютная величина - то есть ваше условие выполнится и в случае, когда ближайшая позиция в профите на десять пунктов. Мне почему-то кажется, что вы пытаетесь все же дистанцию использовать для усреднения. Если это не так и вы действительно хотите просто абсолютную дистанцию до ближайшей позиции, то код получится вот такой: extern int Magic = 123; extern double Lots = 0.01; extern int SL = 10; extern int TP = 10; void start() { int count[] = {0, 0}; int nearestDistance[] = {INT_MAX, INT_MAX}; for(int i = OrdersTotal()-1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() <= OP_SELL) { count[OrderType()]++; int distance = MathAbs(OrderOpenPrice() - (OrderType() == OP_BUY ? Ask : Bid) / Point(); if(distance < nearestDistance[OrderType()]) nearestDistance[OrderType()] = distance; } } // if(count[OP_BUY] > 3 && nearestDistance[OP_BUY] > 10) OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue); // if(count[OP_SELL] > 3 && nearestDistance[OP_SELL] > 10) OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed); } В ЕА 818 использовал так HideTestIndicators(true); double wpr= iWPR(Symbol(),0,4,0); double ao = iAO(Symbol(),0,0); HideTestIndicators(false); double level=NormalizeDouble(data[pos][1],Digits); ObjectDelete("level"); MakeLine(level); if(data[pos][1]>Open[0]) Comment("BUY - ", data[pos][1]); if(data[pos][1]<Open[0]) Comment("SELL - ", data[pos][1]); if(MarketInfo(Symbol(),MODE_SPREAD)>30) return; int TB=0,TS=0; for(i=0; i<OrdersTotal(); i++) { xx=OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicID) { continue; } if(OrderType()==0) { TB++; } if(OrderType()==1) { TS++; } } if(pos>0) { if(CheckMarketBuyOrders()<70 && CheckMarketSellOrders()<70) { if(OrdersTotal() < 50)//количество ордеров { if(Open[1]<Close[0]) { if(DistMarketAndPos(NULL,OP_BUY,MagicID)>10) // Дистанция > 10 пунктов if(data[pos][1]>Open[1] && OP_BySignal == OFF) if(IsBuyPinbar() && TB<Max_OP && (jamOP() || TB>0)) { double BuySL=0; if(SL>0) BuySL=NormalizeDouble(Ask - SL*g_Point,Digits); double BuyTP=NormalizeDouble(Ask + TP*g_Point,Digits); if(AccountFreeMarginCheck(Symbol(),OP_BUY,GetLots())>0) { ticket=OrderSend(Symbol(),OP_BUY,GetLots(),Ask,Slippage,BuySL,BuyTP,"",MagicID,0,clrGreen); if(TPLinier) { ModifyTP(0,rata_price(0)+TP*g_Point); } //CloseSell(); } } } } if(OrdersTotal() < 50)//количество ордеров { if(Open[1]<Close[0]) { if(DistMarketAndPos(NULL,OP_SELL,MagicID)>10) // Дистанция > 10 пунктов if(data[pos][1]<Open[1] && OP_BySignal == OFF) if(IsSellPinbar() && TS<Max_OP && (jamOP() || TS>0)) { double SellSL=0; if(SL>0) SellSL=NormalizeDouble(Bid + SL*g_Point,Digits); double SellTP=NormalizeDouble(Bid - TP*g_Point,Digits); if(AccountFreeMarginCheck(Symbol(),OP_SELL,GetLots())>0) { ticket=OrderSend(Symbol(),OP_SELL,GetLots(),Bid,Slippage,SellSL,SellTP,"",MagicID,0,clrGreen); if(TPLinier) { ModifyTP(1,rata_price(1)-TP*g_Point); } // CloseBuy(); } } } } } } В первую очередь, чтобы не открывал слишком часто ордера, и это помогло, но он читает все открытые ордера. Скорей всего лучше первый вариант, так как второй работает только в худшую сторону. Спасибо буду пробывать Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 4 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 4 декабря, 2023 1 час назад, Rigal сказал: Вы, вероятно, хотите что-то вроде: extern int Magic = 123; extern double Lots = 0.01; extern int SL = 10; extern int TP = 10; void start() { int count[] = {0, 0}; int distanceToBestPosition[] = {INT_MAX, INT_MAX}; for(int i = OrdersTotal()-1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() <= OP_SELL) { count[OrderType()]++; int distance = (OrderType() == OP_BUY ? OrderOpenPrice() - MarketInfo(Symbol(), MODE_ASK) : MarketInfo(Symbol(), MODE_BID - OrderOpenPrice())) / Point(); if(distance < distanceToBestPosition[OrderType()]) distanceToBestPosition[OrderType()] = distance; } } //проверим условие на покупку if(count[OP_BUY] > 3 && distanceToBestPosition[OP_BUY] > 10) OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue); //проверим условие на продажу if(count[OP_SELL] > 3 && distanceToBestPosition[OP_SELL] > 10) OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed); } Я здесь поменял довольно много: например, дистанция может быть положительная (это дистанция против позиции, когда вы хотите усредниться), или отрицательная (когда ваша лучшая позиция в прибыли). В исходной функции Кима вычисляется абсолютная величина - то есть ваше условие выполнится и в случае, когда ближайшая позиция в профите на десять пунктов. Мне почему-то кажется, что вы пытаетесь все же дистанцию использовать для усреднения. Если это не так и вы действительно хотите просто абсолютную дистанцию до ближайшей позиции, то код получится вот такой: extern int Magic = 123; extern double Lots = 0.01; extern int SL = 10; extern int TP = 10; void start() { int count[] = {0, 0}; int nearestDistance[] = {INT_MAX, INT_MAX}; for(int i = OrdersTotal()-1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() <= OP_SELL) { count[OrderType()]++; int distance = MathAbs(OrderOpenPrice() - (OrderType() == OP_BUY ? Ask : Bid) / Point(); if(distance < nearestDistance[OrderType()]) nearestDistance[OrderType()] = distance; } } // if(count[OP_BUY] > 3 && nearestDistance[OP_BUY] > 10) OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue); // if(count[OP_SELL] > 3 && nearestDistance[OP_SELL] > 10) OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed); } К сожалению у меня не получается этот код так легко, как тот что я предоставил внедрить в советник. Советник совсем не хочет торговать Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 4 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 4 декабря, 2023 29 минут назад, Lexa000 сказал: К сожалению у меня не получается этот код так легко, как тот что я предоставил внедрить в советник. Советник совсем не хочет торговать Если оставить только этот код - советник торговать, конечно, не будет. Потому, что этот код открывает сделки только в случае, если у вас их уже открыто больше трех и цена ушла более, чем на 10 пунктов от последнего ордера в серии. Я полагал, что у вас где-то есть фрагмент, отвечающий за открытие первых трех ордеров? Я бы ожидал, что он торгует, как и прежде? Ссылка на сообщение Поделиться на другие сайты More sharing options...
MIHAS__ Опубликовано 4 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 4 декабря, 2023 10 часов назад, Rigal сказал: Fx_s (1)~.mq4 16.98 \u043a\u0411 · 2 загрузки Еще просьба добавить изменение периода CCI CCI_BUY.mq4 CCI_SELL.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 5 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 5 декабря, 2023 В 04.12.2023 в 14:20, Rigal сказал: Если оставить только этот код - советник торговать, конечно, не будет. Потому, что этот код открывает сделки только в случае, если у вас их уже открыто больше трех и цена ушла более, чем на 10 пунктов от последнего ордера в серии. Я полагал, что у вас где-то есть фрагмент, отвечающий за открытие первых трех ордеров? Я бы ожидал, что он торгует, как и прежде? Уважаемый Rigal, я смог использовать ваш код в советнике, но как дополнительный. Он там выдавал 4 предупреждения, я три поправил, а четвертый не могу. possible loss of data due to type conversion вот в этой строчке : int distance = (OrderType() == OP_BUY ? . Можете поправить? Я про этот код Lexa000 Опубликовано 21 час назад 22 часа назад, Rigal сказал: Вы, вероятно, хотите что-то вроде: extern int Magic = 123; extern double Lots = 0.01; extern int SL = 10; extern int TP = 10; void start() { int count[] = {0, 0}; int distanceToBestPosition[] = {INT_MAX, INT_MAX}; for(int i = OrdersTotal()-1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() <= OP_SELL) { count[OrderType()]++; int distance = (OrderType() == OP_BUY ? OrderOpenPrice() - MarketInfo(Symbol(), MODE_ASK) : MarketInfo(Symbol(), MODE_BID - OrderOpenPrice())) / Point(); if(distance < distanceToBestPosition[OrderType()]) distanceToBestPosition[OrderType()] = distance; } } //проверим условие на покупку if(count[OP_BUY] > 3 && distanceToBestPosition[OP_BUY] > 10) OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue); //проверим условие на продажу if(count[OP_SELL] > 3 && distanceToBestPosition[OP_SELL] > 10) OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed); } 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 5 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 5 декабря, 2023 9 часов назад, Lexa000 сказал: Уважаемый Rigal, я смог использовать ваш код в советнике, но как дополнительный. Он там выдавал 4 предупреждения, я три поправил, а четвертый не могу. possible loss of data due to type conversion вот в этой строчке : int distance = (OrderType() == OP_BUY ? . Можете поправить? Я про этот код Lexa000 Опубликовано 21 час назад 22 часа назад, Rigal сказал: Вы, вероятно, хотите что-то вроде: extern int Magic = 123; extern double Lots = 0.01; extern int SL = 10; extern int TP = 10; void start() { int count[] = {0, 0}; int distanceToBestPosition[] = {INT_MAX, INT_MAX}; for(int i = OrdersTotal()-1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() <= OP_SELL) { count[OrderType()]++; int distance = (OrderType() == OP_BUY ? OrderOpenPrice() - MarketInfo(Symbol(), MODE_ASK) : MarketInfo(Symbol(), MODE_BID - OrderOpenPrice())) / Point(); if(distance < distanceToBestPosition[OrderType()]) distanceToBestPosition[OrderType()] = distance; } } //проверим условие на покупку if(count[OP_BUY] > 3 && distanceToBestPosition[OP_BUY] > 10) OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue); //проверим условие на продажу if(count[OP_SELL] > 3 && distanceToBestPosition[OP_SELL] > 10) OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed); } int distance = int((OrderType() == OP_BUY ? OrderOpenPrice() - MarketInfo(Symbol(), MODE_ASK) : MarketInfo(Symbol(), MODE_BID - OrderOpenPrice())) / Point()); 21 час назад, MIHAS__ сказал: Еще просьба добавить изменение периода CCI CCI_BUY.mq4 5.3 \u043a\u0411 · 0 загрузок CCI_SELL.mq4 5.3 \u043a\u0411 · 0 загрузок добавил период и пороговое значение. Ну так, не помешает CCI_SELL.mq4 CCI_BUY.mq4 Изменено 5 декабря, 2023 пользователем Rigal 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 18 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 18 декабря, 2023 В 27.02.2023 в 23:17, Rigal сказал: забирайте Trailer.mq4 7.5 \u043a\u0411 · 12 загрузок Уважаемый Rigal, можно вас попросить об одной мелочи, можете добавить к срабатыванию Тралла цветные линии? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 19 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 19 декабря, 2023 7 часов назад, Lexa000 сказал: Уважаемый Rigal, можно вас попросить об одной мелочи, можете добавить к срабатыванию Тралла цветные линии? нарисуйте, мне непонятно Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 19 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 19 декабря, 2023 6 часов назад, Rigal сказал: нарисуйте, мне непонятно PrOver=NormalizeDouble(Ask,Digits); flag=true; if(Info) { DrawLine("IOverTP",PrOver,ColOver0,1); } } else if(flag && !flag1 && Ask<PrOver-OverTralStart*Point) { flag1=true; if(Info) { DrawLine("IOverTP",PrOver,ColOver1,1); //=========================================================================================================================================// // Отрисовка линий // //====================================================================/ void DrawLine(string name,double price,color cols,int width) { if(ObjectFind(name)<0) ObjectCreate(name,OBJ_HLINE,0,0,price); else ObjectMove(name,0,Time[1],price); ObjectSet(name,OBJPROP_COLOR,cols); ObjectSet(name,OBJPROP_WIDTH,width); ObjectSet(name,OBJPROP_BACK,true); } Что то из этого 5 часов назад, Lexa000 сказал: PrOver=NormalizeDouble(Ask,Digits); flag=true; if(Info) { DrawLine("IOverTP",PrOver,ColOver0,1); } } else if(flag && !flag1 && Ask<PrOver-OverTralStart*Point) { flag1=true; if(Info) { DrawLine("IOverTP",PrOver,ColOver1,1); //=========================================================================================================================================// // Отрисовка линий // //====================================================================/ void DrawLine(string name,double price,color cols,int width) { if(ObjectFind(name)<0) ObjectCreate(name,OBJ_HLINE,0,0,price); else ObjectMove(name,0,Time[1],price); ObjectSet(name,OBJPROP_COLOR,cols); ObjectSet(name,OBJPROP_WIDTH,width); ObjectSet(name,OBJPROP_BACK,true); } Что то из этого Нашел такой пример #property strict //--- описание #property description "Скрипт строит графический объект \"Горизонтальная линия\"." #property description "Цена точки привязки задается в процентах от высоты" #property description "окна графика." //--- покажем окно входных параметров при запуске скрипта #property script_show_inputs //--- входные параметры скрипта input string InpName="HLine"; // Имя линии input int InpPrice=25; // Цена линии в % input color InpColor=clrRed; // Цвет линии input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Стиль линии input int InpWidth=1; // Толщина линии input bool InpBack=false; // Линия на заднем плане input bool InpSelection=true; // Выделить для перемещений input bool InpHidden=true; // Скрыт в списке объектов input long InpZOrder=0; // Приоритет на нажатие мышью //+------------------------------------------------------------------+ //| Создает горизонтальную линию | //+------------------------------------------------------------------+ bool HLineCreate(const long chart_ID=0, // ID графика const string name="HLine", // имя линии const int sub_window=0, // номер подокна double price=0, // цена линии const color clr=clrRed, // цвет линии const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии const int width=1, // толщина линии const bool back=false, // на заднем плане const bool selection=true, // выделить для перемещений const bool hidden=true, // скрыт в списке объектов const long z_order=0) // приоритет на нажатие мышью { //--- если цена не задана, то установим ее на уровне текущей цены Bid if(!price) price=SymbolInfoDouble(Symbol(),SYMBOL_BID); //--- сбросим значение ошибки ResetLastError(); //--- создадим горизонтальную линию if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price)) { Print(__FUNCTION__, ": не удалось создать горизонтальную линию! Код ошибки = ",GetLastError()); return(false); } //--- установим цвет линии ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- установим стиль отображения линии ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); //--- установим толщину линии ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); //--- отобразим на переднем (false) или заднем (true) плане ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); //--- включим (true) или отключим (false) режим перемещения линии мышью //--- при создании графического объекта функцией ObjectCreate, по умолчанию объект //--- нельзя выделить и перемещать. Внутри же этого метода параметр selection //--- по умолчанию равен true, что позволяет выделять и перемещать этот объект ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); //--- установим приоритет на получение события нажатия мыши на графике ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); //--- успешное выполнение return(true); } //+------------------------------------------------------------------+ //| Перемещение горизонтальной линии | //+------------------------------------------------------------------+ bool HLineMove(const long chart_ID=0, // ID графика const string name="HLine", // имя линии double price=0) // цена линии { //--- если цена линии не задана, то перемещаем ее на уровень текущей цены Bid if(!price) price=SymbolInfoDouble(Symbol(),SYMBOL_BID); //--- сбросим значение ошибки ResetLastError(); //--- переместим горизонтальную линию if(!ObjectMove(chart_ID,name,0,0,price)) { Print(__FUNCTION__, ": не удалось переместить горизонтальную линию! Код ошибки = ",GetLastError()); return(false); } //--- успешное выполнение return(true); } //+------------------------------------------------------------------+ //| Удаляет горизонтальную линию | //+------------------------------------------------------------------+ bool HLineDelete(const long chart_ID=0, // ID графика const string name="HLine") // имя линии { //--- сбросим значение ошибки ResetLastError(); //--- удалим горизонтальную линию if(!ObjectDelete(chart_ID,name)) { Print(__FUNCTION__, ": не удалось удалить горизонтальную линию! Код ошибки = ",GetLastError()); return(false); } //--- успешное выполнение return(true); } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- проверим входные параметры на корректность if(InpPrice<0 || InpPrice>100) { Print("Ошибка! Некорректные значения входных параметров!"); return; } //--- размер массива price int accuracy=1000; //--- массив для хранения значений цен, которые будут использованы //--- для установки и изменения координаты точки привязки линии double price[]; //--- выделение памяти ArrayResize(price,accuracy); //--- заполним массив цен //--- найдем максимальное и минимальное значение графика double max_price=ChartGetDouble(0,CHART_PRICE_MAX); double min_price=ChartGetDouble(0,CHART_PRICE_MIN); //--- определим шаг изменения цены и заполним массив double step=(max_price-min_price)/accuracy; for(int i=0;i<accuracy;i++) price[i]=min_price+i*step; //--- определим точки для рисования линии int p=InpPrice*(accuracy-1)/100; //--- создадим горизонтальную линию if(!HLineCreate(0,InpName,0,price[p],InpColor,InpStyle,InpWidth,InpBack, InpSelection,InpHidden,InpZOrder)) { return; } //--- перерисуем график и подождем 1 секунду ChartRedraw(); Sleep(1000); //--- теперь будем перемещать линию //--- счетчик цикла int v_steps=accuracy/2; //--- перемещаем линию for(int i=0;i<v_steps;i++) { //--- возьмем следующее значение if(p<accuracy-1) p+=1; //--- сдвигаем точку if(!HLineMove(0,InpName,price[p])) return; //--- проверим факт принудительного завершения скрипта if(IsStopped()) return; //--- перерисуем график ChartRedraw(); } //--- задержка в 1 секунду Sleep(1000); //--- удалим с графика HLineDelete(0,InpName); ChartRedraw(); //--- задержка в 1 секунду Sleep(1000); //--- } Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 19 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 19 декабря, 2023 10 часов назад, Lexa000 сказал: PrOver=NormalizeDouble(Ask,Digits); flag=true; if(Info) { DrawLine("IOverTP",PrOver,ColOver0,1); } } else if(flag && !flag1 && Ask<PrOver-OverTralStart*Point) { flag1=true; if(Info) { DrawLine("IOverTP",PrOver,ColOver1,1); //=========================================================================================================================================// // Отрисовка линий // //====================================================================/ void DrawLine(string name,double price,color cols,int width) { if(ObjectFind(name)<0) ObjectCreate(name,OBJ_HLINE,0,0,price); else ObjectMove(name,0,Time[1],price); ObjectSet(name,OBJPROP_COLOR,cols); ObjectSet(name,OBJPROP_WIDTH,width); ObjectSet(name,OBJPROP_BACK,true); } Что то из этого Нашел такой пример #property strict //--- описание #property description "Скрипт строит графический объект \"Горизонтальная линия\"." #property description "Цена точки привязки задается в процентах от высоты" #property description "окна графика." //--- покажем окно входных параметров при запуске скрипта #property script_show_inputs //--- входные параметры скрипта input string InpName="HLine"; // Имя линии input int InpPrice=25; // Цена линии в % input color InpColor=clrRed; // Цвет линии input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Стиль линии input int InpWidth=1; // Толщина линии input bool InpBack=false; // Линия на заднем плане input bool InpSelection=true; // Выделить для перемещений input bool InpHidden=true; // Скрыт в списке объектов input long InpZOrder=0; // Приоритет на нажатие мышью //+------------------------------------------------------------------+ //| Создает горизонтальную линию | //+------------------------------------------------------------------+ bool HLineCreate(const long chart_ID=0, // ID графика const string name="HLine", // имя линии const int sub_window=0, // номер подокна double price=0, // цена линии const color clr=clrRed, // цвет линии const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии const int width=1, // толщина линии const bool back=false, // на заднем плане const bool selection=true, // выделить для перемещений const bool hidden=true, // скрыт в списке объектов const long z_order=0) // приоритет на нажатие мышью { //--- если цена не задана, то установим ее на уровне текущей цены Bid if(!price) price=SymbolInfoDouble(Symbol(),SYMBOL_BID); //--- сбросим значение ошибки ResetLastError(); //--- создадим горизонтальную линию if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price)) { Print(__FUNCTION__, ": не удалось создать горизонтальную линию! Код ошибки = ",GetLastError()); return(false); } //--- установим цвет линии ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- установим стиль отображения линии ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); //--- установим толщину линии ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); //--- отобразим на переднем (false) или заднем (true) плане ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); //--- включим (true) или отключим (false) режим перемещения линии мышью //--- при создании графического объекта функцией ObjectCreate, по умолчанию объект //--- нельзя выделить и перемещать. Внутри же этого метода параметр selection //--- по умолчанию равен true, что позволяет выделять и перемещать этот объект ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); //--- установим приоритет на получение события нажатия мыши на графике ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); //--- успешное выполнение return(true); } //+------------------------------------------------------------------+ //| Перемещение горизонтальной линии | //+------------------------------------------------------------------+ bool HLineMove(const long chart_ID=0, // ID графика const string name="HLine", // имя линии double price=0) // цена линии { //--- если цена линии не задана, то перемещаем ее на уровень текущей цены Bid if(!price) price=SymbolInfoDouble(Symbol(),SYMBOL_BID); //--- сбросим значение ошибки ResetLastError(); //--- переместим горизонтальную линию if(!ObjectMove(chart_ID,name,0,0,price)) { Print(__FUNCTION__, ": не удалось переместить горизонтальную линию! Код ошибки = ",GetLastError()); return(false); } //--- успешное выполнение return(true); } //+------------------------------------------------------------------+ //| Удаляет горизонтальную линию | //+------------------------------------------------------------------+ bool HLineDelete(const long chart_ID=0, // ID графика const string name="HLine") // имя линии { //--- сбросим значение ошибки ResetLastError(); //--- удалим горизонтальную линию if(!ObjectDelete(chart_ID,name)) { Print(__FUNCTION__, ": не удалось удалить горизонтальную линию! Код ошибки = ",GetLastError()); return(false); } //--- успешное выполнение return(true); } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- проверим входные параметры на корректность if(InpPrice<0 || InpPrice>100) { Print("Ошибка! Некорректные значения входных параметров!"); return; } //--- размер массива price int accuracy=1000; //--- массив для хранения значений цен, которые будут использованы //--- для установки и изменения координаты точки привязки линии double price[]; //--- выделение памяти ArrayResize(price,accuracy); //--- заполним массив цен //--- найдем максимальное и минимальное значение графика double max_price=ChartGetDouble(0,CHART_PRICE_MAX); double min_price=ChartGetDouble(0,CHART_PRICE_MIN); //--- определим шаг изменения цены и заполним массив double step=(max_price-min_price)/accuracy; for(int i=0;i<accuracy;i++) price[i]=min_price+i*step; //--- определим точки для рисования линии int p=InpPrice*(accuracy-1)/100; //--- создадим горизонтальную линию if(!HLineCreate(0,InpName,0,price[p],InpColor,InpStyle,InpWidth,InpBack, InpSelection,InpHidden,InpZOrder)) { return; } //--- перерисуем график и подождем 1 секунду ChartRedraw(); Sleep(1000); //--- теперь будем перемещать линию //--- счетчик цикла int v_steps=accuracy/2; //--- перемещаем линию for(int i=0;i<v_steps;i++) { //--- возьмем следующее значение if(p<accuracy-1) p+=1; //--- сдвигаем точку if(!HLineMove(0,InpName,price[p])) return; //--- проверим факт принудительного завершения скрипта if(IsStopped()) return; //--- перерисуем график ChartRedraw(); } //--- задержка в 1 секунду Sleep(1000); //--- удалим с графика HLineDelete(0,InpName); ChartRedraw(); //--- задержка в 1 секунду Sleep(1000); //--- } Стало еще менее понятно. Если у вас есть код - вам моя помощь не нужна. Если вам нужна моя помощь - объясните, чего вы хотите, не нужно слать левый код: то, что я с нуля напишу за 15 минут, в левом коде потребует полтора часа. Нарисуйте на графиках результат, который вы хотите, объясните словами динамику. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 19 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 19 декабря, 2023 2 минуты назад, Rigal сказал: Стало еще менее понятно. Если у вас есть код - вам моя помощь не нужна. Если вам нужна моя помощь - объясните, чего вы хотите, не нужно слать левый код: то, что я с нуля напишу за 15 минут, в левом коде потребует полтора часа. Нарисуйте на графиках результат, который вы хотите, объясните словами динамику. Просто обычную горизонтальную линию срабатывания Тралла, до его завершения. Ссылка на сообщение Поделиться на другие сайты More sharing options...
SkyzerFx Опубликовано 19 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 19 декабря, 2023 Старая сова PipStrder Работает неплохо.. Ищу как можно поменять несколько строчек кода.. Меня интересует только опция "TradeDirection" Когда, выставляется значение 2 то соответственно после Профита Происходит РЕВЕРС в другую сторону.. Здесь ЛОГИЧЕСКАЯ ПРОБЛЕМКА.. Когда СОВА жрет ПО ТРЕНДУ то РАЗВОРАЧИВАТЬСЯ НЕ НАДО, т.е Я хочу чтобы была добавлена ПЕРЕМЕННАЯ допустим "AfterLevel" -2 ( и значение).. Т.е РАЗВОРАЧИВАТЬСЯ только когда ПРОФИТ был достигнут после 3-его КОЛЕНА.. т.е переводя на логику.. МЫ ШПАРИМ по ТРЕНДУ, если ТРЕНД РАЗВЕРНУЛСЯ то И СЕТКА НАЧИНАЕТ РАЗДВИГАТЬСЯ, А следовательно надо разворачиваться, Т.Е можно поэкперементиорвать или после 2-ого колена разворот или после 3-его.. КОД это Версия 1.34, но она нормально работает.. Кто то может этот кусочек изменить? Хотел заставить AI поменять код, но так называеный "интеллект" тупит и выдает ЕРРОР :))) Ок не проблема, раз никто не хочет, я пожалуй могу менять директорию мануально в зависимости от тренда.. Изменено 22 декабря, 2023 пользователем SkyzerFx Ссылка на сообщение Поделиться на другие сайты More sharing options...
dog-cat2020 Опубликовано 22 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 22 декабря, 2023 Здравствуйте, нужна помощь. Не могу написать функцию в советник, которая будет закрывать BUY_STOP если новая свеча закроется ниже определённого уровня. Буду рад любой помощи! Изменено 22 декабря, 2023 пользователем dog-cat2020 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 25 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 25 декабря, 2023 В 19.12.2023 в 16:58, Rigal сказал: Стало еще менее понятно. Если у вас есть код - вам моя помощь не нужна. Если вам нужна моя помощь - объясните, чего вы хотите, не нужно слать левый код: то, что я с нуля напишу за 15 минут, в левом коде потребует полтора часа. Нарисуйте на графиках результат, который вы хотите, объясните словами динамику. Вот так Можете сделать? Изменено 25 декабря, 2023 пользователем Lexa000 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 25 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 25 декабря, 2023 В вашем советнике Challenger есть похожая функция, где рамки показывают начало, движение и закрытие тралла Ссылка на сообщение Поделиться на другие сайты More sharing options...
sportoman Опубликовано 26 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 26 декабря, 2023 Доброго дня! Хочу попросить помощи у знающих. У меня есть код индикатора и хочу его вставить в советник в виде функции. #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Blue #property indicator_width1 1 #property indicator_color2 Red #property indicator_width2 1 #define SH_BUY 1 #define SH_SELL -1 //---- Входные параметры extern int AllBars=0;//How many bars should be counted. 0 - all the bars. extern int Otstup=30;//Step back. extern double Per=9;//Period. extern bool UseSoundBuy=true; extern bool AlertSoundBuy=true; extern bool UseSoundSell=true; extern bool AlertSoundSell=true; extern string SoundFileBuy ="tada.wav"; extern string SoundFileSell="email.wav"; extern bool SendMailPossible = false; extern int SIGNAL_BAR= 1; bool SoundBuy = False; bool SoundSell = False; int SH,NB,i,UD,x=0,y=0,a=0,b=0; double R,SHMax,SHMin; double BufD[]; double BufU[]; //+------------------------------------------------------------------+ //| Функция инициализации | //+------------------------------------------------------------------+ int init() { //We will write the number of the bars for which we are counting to the NB if (Bars<AllBars+Per || AllBars==0) NB=Bars-Per; else NB=AllBars; IndicatorBuffers(2); IndicatorShortName("SHI_SilverTrendSig"); SetIndexStyle(0,DRAW_ARROW); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(0,217); SetIndexArrow(1,218); SetIndexBuffer(0,BufU); SetIndexBuffer(1,BufD); SetIndexDrawBegin(0,Bars-NB);//This indicator will be shown for NB bar only SetIndexDrawBegin(1,Bars-NB); // ArrayInitialize(BufD,0.0);//Give a lot of "zero" to the buffe. Otherwise it will be garbage during the changing of time frame. // ArrayInitialize(BufU,0.0); return(0); } //+------------------------------------------------------------------+ //| Функция деинициализации | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| Собсна индикатор | //+------------------------------------------------------------------+ int start() { int CB=IndicatorCounted(); /* It is the optimization option. We have the function here which restore/return the number of counted bars in very special way. During the first indicator's call we have 0: it is normal because it was not counted anything, and then we receive the number of bars minus 1. For example, if the number of bars equal 100, we will have 99. I did it especially, you may see that NB is the number of bars whioch should be counted. You know we may throw out this parameter. But for the people who understand we may keep it. So, during the first call of indicator this NB is the same one but during the 2dn etc calls - reducing the value up to the last bar, That is 1 or 2 for example*/ if(CB<0) return(-1); else if(NB>Bars-CB) NB=Bars-CB; for (SH=1;SH<=NB;SH++)//comb out the chart from 1 to NB { for (R=0,i=SH;i<SH+10;i++) {R+=(10+SH-i)*(High[i]-Low[i]);} R/=55; SHMax = High[Highest(NULL,0,MODE_HIGH,Per,SH)]; SHMin = Low[Lowest(NULL,0,MODE_LOW,Per,SH)]; if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY) { BufD[SH]=High[SH]+R*0.5; /*if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY)*/ UD=SH_BUY; /*if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY)*/ y=0; x=x+1; } else if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL) { BufU[SH]=Low[SH]-R*0.5; /*if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL)*/UD=SH_SELL; /*if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL)*/ x=0; y=y+1; } } //----------------------- ALERT ON UP / DOWN DOT //string AlertComment; string message = StringConcatenate("60s Master.v3 (", Symbol(), ", ", Period(), ") - BUY!!!" ,"-" ,TimeToStr(TimeLocal(),TIME_SECONDS)); string message2 = StringConcatenate("60s Master.v3 (", Symbol(), ", ", Period(), ") - SELL!!!","-" ,TimeToStr(TimeLocal(),TIME_SECONDS)); if (BufU[SIGNAL_BAR] != EMPTY_VALUE && BufU[SIGNAL_BAR] != 0 && SoundBuy) { SoundBuy = False; if (UseSoundBuy) PlaySound (SoundFileBuy); if(AlertSoundBuy){ Alert(message); if (SendMailPossible) SendMail(Symbol(),message); } } if (!SoundBuy && (BufU[SIGNAL_BAR] == EMPTY_VALUE || BufU[SIGNAL_BAR] == 0)) SoundBuy = True; if (BufD[SIGNAL_BAR] != EMPTY_VALUE && BufD[SIGNAL_BAR] != 0 && SoundSell) { SoundSell = False; if (UseSoundSell) PlaySound (SoundFileSell); if(AlertSoundSell){ Alert(message2); if (SendMailPossible) SendMail(Symbol(),message2); } } if (!SoundSell && (BufD[SIGNAL_BAR] == EMPTY_VALUE || BufD[SIGNAL_BAR] == 0)) SoundSell = True; //+------------------------------------------------------------------+ //----------------------- END FUNCTION return(0); } С частью, где проверяются условия на алерт все понятно, она не нужна, нужна будет проверка if (BufU[SIGNAL_BAR] != EMPTY_VALUE && BufU[SIGNAL_BAR] != 0) и т.д., а вот все выше..... Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 26 декабря, 2023 Поделиться Доработка советников: общая тема Опубликовано 26 декабря, 2023 14 часов назад, Lexa000 сказал: В вашем советнике Challenger есть похожая функция, где рамки показывают начало, движение и закрытие тралла Я еще пару недель на отдыхе, компьютер вижу урывками. Посмотрю при случае Ссылка на сообщение Поделиться на другие сайты More sharing options...
Vova2109 Опубликовано 9 января, 2024 Поделиться Доработка советников: общая тема Опубликовано 9 января, 2024 Подскажите , можно ли убрать привязку к сайтам с советника, без них он не работает MTA ALGO - ELLIOT WAVE.ex4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
drobayura Опубликовано 14 января, 2024 Поделиться Доработка советников: общая тема Опубликовано 14 января, 2024 Уважаемые программисты, можно написать такой советник? 1. На HIGH свечи выставляется BUYSTOP, на LOW свечи SELLSTOP. 2. ТР равен 0.6*ATR PERIOD_D1(21), SL равен 0.5*ATR PERIOD_D1(21). 3. LOT рассчитывается с риском от величины SL. Risk вывести во входные параметры советника отдельно для BUY и для SELL, Risk должен отображаться дробным числом (0,4; 1,0; 1,3 и т.д.). 4. Следующая серия сделок BUYSTOP и SELLSTOP может выставиться только после полного закрытия предыдущей серии сделок. 5. Если закрылась сделка по ТР, а противоположная отложенная её удаляем. Выражаю глубочайшее уважение людям интеллектуального труда. Изменено 14 января, 2024 пользователем drobayura Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 14 января, 2024 Поделиться Доработка советников: общая тема Опубликовано 14 января, 2024 3 часа назад, drobayura сказал: Уважаемые программисты, можно написать такой советник? 1. На HIGH свечи выставляется BUYSTOP, на LOW свечи SELLSTOP. 2. ТР равен 0.6*ATR PERIOD_D1(21), SL равен 0.5*ATR PERIOD_D1(21). 3. LOT рассчитывается с риском от величины SL. Risk вывести во входные параметры советника отдельно для BUY и для SELL, Risk должен отображаться дробным числом (0,4; 1,0; 1,3 и т.д.). 4. Следующая серия сделок BUYSTOP и SELLSTOP может выставиться только после полного закрытия предыдущей серии сделок. 5. Если закрылась сделка по ТР, а противоположная отложенная её удаляем. Выражаю глубочайшее уважение людям интеллектуального труда. Не планирую писать, но формулировка задачи расплывчатая. 1. на high и low какой свечи 2. какого тф 3. в какой момент оно выставляется? 4. что делать, если в этот момент одну из сделок выставить нельзя 5. риск, я так понимаю, от депозита - это в процентах? Ссылка на сообщение Поделиться на другие сайты More sharing options...
drobayura Опубликовано 15 января, 2024 Поделиться Доработка советников: общая тема Опубликовано 15 января, 2024 1. Свеча не важно. 2. ТФ - Н1. 3. В европейскую сессию (с 08:00 до 14:00 по Лондону). 5. Да Риск в процентах от свободных средств. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 15 января, 2024 Поделиться Доработка советников: общая тема Опубликовано 15 января, 2024 10 часов назад, drobayura сказал: 1. Свеча не важно. Недельной давности подойдет? Или на текущей, на открытие свечи? Сразу отсыл к четвертому вопросу 10 часов назад, drobayura сказал: 3. В европейскую сессию (с 08:00 до 14:00 по Лондону). это прекрасно. А внутри часа в какой момент? Этот вопрос тоже тесно связан с четвертым. На который вы не ответили Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти