Запомнить N-значений цен

 

Нужно запомнить N-значений цен
Т.е. открылся ордер, есть его цена открытия, далее требуется запомнить N-ближайших цен с шагом для построения сетки отложенных ордеров,
или открытия рыночных если цена соответствует значению 

extern int Step = 100;
extern int MaxOrders = 15; 

double PrcB=0.0;
bool PB=true;

int start(){

   if(buy_order==1 && PB) {PrcB=LastPriceB;PB=false;}
   if(PrcB!=0.0) PrcB=PrcB-Step*Point;

   if(buy_order==0) {PB=true;PrcB=0.0;}

PrcB расставляет сетку отлож.ордеров до бесконечности
Надо запомнить ближайшие к цене не больше чем MaxOrders и лучше их зациклить,
т.к. требуется не отложками расставлять, а рыночными если цена приблизилась к одной из записанных цен

 
Natalya Dzerzhinskaya:

Нужно запомнить N-значений цен
Т.е. открылся ордер, есть его цена открытия, далее требуется запомнить N-ближайших цен с шагом для построения сетки отложенных ордеров,
или открытия рыночных если цена соответствует значению 

PrcB расставляет сетку отлож.ордеров до бесконечности
Надо запомнить ближайшие к цене не больше чем MaxOrders и лучше их зациклить,
т.к. требуется не отложками расставлять, а рыночными если цена приблизилась к одной из записанных цен

Так вопрос не ясен, собственно в чём у Вас сложность ?

 
Sergey Kolemanov:

Так вопрос не ясен, собственно в чём у Вас сложность ?

Сложность запомнить первые 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);
}
//--------------------------------------------------------------------

Natalya Dzerzhinskaya:

Сложность запомнить первые 15 полученных цен от PrcB и на каждом тике перебирать эти полученные цены.
Надо заполнить массив и крутить эти значения в цикле.

ну и перебирайте в цикле от 0 до ArraySize()-1 и сравнивайте поэлементно

если в две стороны от стартовой цены сетка, то сделайте 2 массива и перебирайте один массив на >Bid, а другой на <Ask  - зависит от торговой стратегии

 
Natalya Dzerzhinskaya:

Сложность запомнить первые 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);
}
 
Igor Makanu:

вот нашел у себя скрипт - рисует горизонтальные линии, с шагом 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));
     }
 
Taras Slobodyanik:

А зачем помнить эти значения?
Достаточно сохранить первую цену и количество шагов.

Перебирать в цикле, по нужной формуле.
Например, арифметическая прогрессия на 10 шагов:

Ваш пример мне подходит.
Нужное кол-во цен записано корректно и теперь я могу с ними оперировать, хоть отложки, хоть рыночные отрабатывать.
Всем спасибо))

Причина обращения: