Нужно запомнить N-значений цен
Т.е. открылся ордер, есть его цена открытия, далее требуется запомнить N-ближайших цен с шагом для построения сетки отложенных ордеров,
или открытия рыночных если цена соответствует значению
PrcB расставляет сетку отлож.ордеров до бесконечности
Надо запомнить ближайшие к цене не больше чем MaxOrders и лучше их зациклить,
т.к. требуется не отложками расставлять, а рыночными если цена приблизилась к одной из записанных цен
Так вопрос не ясен, собственно в чём у Вас сложность ?
Так вопрос не ясен, собственно в чём у Вас сложность ?
Сложность запомнить первые 15 полученных цен от PrcB и на каждом тике перебирать эти полученные цены.
Надо заполнить массив и крутить эти значения в цикле.
вот нашел у себя скрипт - рисует горизонтальные линии, с шагом Step , может такого примера Вам будет достаточно?
#property strict #property show_inputs input int Step = 100; input int N = 10; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- double up,dn, st = NormalizeDouble(Close[0],Digits-2); DrawLINE(IntegerToString(0),st,clrRed); up = st; dn = st; for(int i=0;i<N;i++){ up += Point*Step; dn -= Point*Step; DrawLINE("up"+IntegerToString(i),up,clrSilver); DrawLINE("dn"+IntegerToString(i),dn,clrSilver); } } //------------------------------------------------------------------ void DrawLINE(string name, double Y, color clr) { if (ObjectFind(name)==-1) { ObjectCreate(name, OBJ_HLINE, 0, Time[1], Y); } ObjectSet(name,OBJPROP_PRICE1,Y); ObjectSet(name,OBJPROP_COLOR,clr); } //--------------------------------------------------------------------
Сложность запомнить первые 15 полученных цен от PrcB и на каждом тике перебирать эти полученные цены.
Надо заполнить массив и крутить эти значения в цикле.
ну и перебирайте в цикле от 0 до ArraySize()-1 и сравнивайте поэлементно
если в две стороны от стартовой цены сетка, то сделайте 2 массива и перебирайте один массив на >Bid, а другой на <Ask - зависит от торговой стратегии
Сложность запомнить первые 15 полученных цен от PrcB и на каждом тике перебирать эти полученные цены.
Надо заполнить массив и крутить эти значения в цикле.
Вот как пример, но рассчитывает цены сетки только от первой открытой позиции, остальные игнорирует...
#property copyright "Copyright 2015, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict input int Step = 100; input int MaxOrders = 15; double arr_price[]; int first_ticket = 0; double first_price = 0.0; int type = -1; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { ArrayResize(arr_price, MaxOrders); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Comment(""); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { int ticket = Get_DataOrder(first_price, type); if(ticket == 0 && first_ticket != 0) { ArrayInitialize(arr_price, 0.0); first_ticket = 0; first_price = 0.0; type = -1; } if(ticket != 0 && ticket != first_ticket) { first_ticket = ticket; Find_PriceGrid(arr_price, first_price, type, Step); } Get_ValueArr(arr_price); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ // функция ищет первую открытую позицию // //+------------------------------------------------------------------+ int Get_DataOrder(double &p, int &t) { datetime time = 0; int ticket = 0; for(int i = OrdersTotal()-1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && (OrderType() == OP_BUY || OrderType() == OP_SELL)) { if(time == 0 || time > OrderOpenTime()) { time = OrderOpenTime(); ticket = OrderTicket(); p = OrderOpenPrice(); t = OrderType(); } } } } return(ticket); } //+------------------------------------------------------------------+ // // //+------------------------------------------------------------------+ void Find_PriceGrid(double & arr[], double p, int t, int step) { int limit = ArrayRange(arr, 0); for(int i = 0; i < limit; i++) { if(t == OP_BUY)arr[i] = NormalizeDouble(p - step * _Point, _Digits); if(t == OP_SELL)arr[i] = NormalizeDouble(p + step * _Point, _Digits); p = arr[i]; } } //+------------------------------------------------------------------+ // крутим значения в цикле и выводим результат // //+------------------------------------------------------------------+ void Get_ValueArr(double & arr[]) { int limit = ArrayRange(arr, 0); string comm = ""; for(int i = 0; i < limit; i++) { comm += (string)(i + 1) + ". " + DoubleToString(arr[i], _Digits) + "\n"; } Comment(comm); }
вот нашел у себя скрипт - рисует горизонтальные линии, с шагом Step , может такого примера Вам будет достаточно?
Нет, этого не достаточно.
Более глобально надо подойти к решению.
Есть 1-ый ордер, далее идёт расчёт с шагом, тут всё правильно.
Сложность заключается в том, что расчёт этих цен и сетка ордеров бесконечен, а надо взять цены только первых 10 например.
И эти цены держать в памяти, чтобы при закрытии ордера на это же место вставал новый отл.ордер.
Или если торговать рыночными ордерами, то при подходе текущ.цены к цене которая в памяти открывался рыночный ордер.
Поэтому мне и надо записать в массив первые 10 цен и перебирать их в цикле.
А зачем помнить эти значения?
Достаточно сохранить первую цену и количество шагов.
Перебирать в цикле, по нужной формуле.
Например, арифметическая прогрессия на 10 шагов:
double price=1.16681; double dist=0.00010; int step=10; for(int i=0; i<step; i++) { double next_price=price + dist*i; Print(DoubleToStr(next_price)); }
А зачем помнить эти значения?
Достаточно сохранить первую цену и количество шагов.
Перебирать в цикле, по нужной формуле.
Например, арифметическая прогрессия на 10 шагов:
Ваш пример мне подходит.
Нужное кол-во цен записано корректно и теперь я могу с ними оперировать, хоть отложки, хоть рыночные отрабатывать.
Всем спасибо))
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Нужно запомнить N-значений цен
Т.е. открылся ордер, есть его цена открытия, далее требуется запомнить N-ближайших цен с шагом для построения сетки отложенных ордеров,
или открытия рыночных если цена соответствует значению
PrcB расставляет сетку отлож.ордеров до бесконечности
Надо запомнить ближайшие к цене не больше чем MaxOrders и лучше их зациклить,
т.к. требуется не отложками расставлять, а рыночными если цена приблизилась к одной из записанных цен