Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 182

 
Artyom Trishkin:
А вы ж ни куска своего кода не показали - относительно чего пример показывать не понятно.

struct p{

double trailingProfit;

int orders[10];

bool flagOpen;// флаг , указывающий на открытость позиции

//тут еще куча связанных параметров

};


p order[];

int OrderN=-1;


int OnInit()
  {

   ArrayResize(pair,1,1000);
 

   return(INIT_SUCCEEDED);
  }

void openOrder(price){

       OrderN++;

       int t;

       ArrayResize(orders,order+1);

      t=OrderSend(Symbol(),OP_BUYSTOP,2,(NormalizeDouble(price,Digits)),3,0,0,"pair",MAGICN,0,Blue);
      if(t==0) Print("не удалось выставить ордер BUYSTOP ", price);

      for(intj=0,j<10,++j){     

      if(orders[OrderN].orders==0) orders[OrderN].orders=t;

      break;

      }

      orders[OrderN].flagOpen=1;

}

//...... тут идет обработка позиций...

void massCut(){

// нужна вот такая функция

}

Когда советник долго работает - массив становится слишком большой для обработки, и есть необходимость его уменьшать. Все старые закрытые ордера находятся в начале, все что находится после первого найденного открытого ордера - надо оставить.
 
Evgenii:

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

Что произойдёт с массивом структур при перезапуске советника?

 
Artyom Trishkin:

Что произойдёт с массивом структур при перезапуске советника?

массив слетит, этот вопрос не решен.
 
Evgenii:
массив слетит, этот вопрос не решен.

Воот. А это нужно было обдумать в первую очередь.

Вывод напрашивается сам: массив нужно обнулять и заново заполнять текущим состоянием ордеров и позиций. Но делать это нужно только тогда, когда ловите факт изменения количества ордеров или позиций на счёте.

Всегда будете иметь под рукой только актуальное текущее состояние ордеров и позиций, и не нужно будет выдумывать пляски с удалением несуществующих ордеров/позиций из массива. И список ордеров/позиций придётся прокручивать полностью, либо на заданный промежуток глубины истории, но лишь в специфических случаях - изменение количества ордеров/позиций на счёте.

 
Alexey Viktorov:
А зачем такое извращение?

что бы  в OnInit при каждой переинициализации не вертелся и сократить статический массив в один экземпляр так как в некоторых местах он написан дважды.. вообщем это оптимизация ресурсов
.. ну оставлю как есть так проще получается на данный момент
 
LRA:
Объявляете глобальный массив без указания размера. Функция Ваша устанавливает его размер ArrayResize. И видно глобально, и OnInit освобождена...

не совсем то наверно, массив статический с чётко прописанными значениями раздельно инициализировать не имеет смысла(
 
Money_Maker:

что бы  в OnInit при каждой переинициализации не вертелся и сократить статический массив в один экземпляр так как в некоторых местах он написан дважды.. вообщем это оптимизация ресурсов
.. ну оставлю как есть так проще получается на данный момент
Чтобы при каждой переинициализации не вертелся в OnOnit() достаточно поставить проверку причины деинициализации UninitializeReason(), а дальше я нихрена ничего не понял. Что значит сократить статический массив??? А в общем-то тебе видней.
 
А в тестере МТ4 комиссии не учитываются что ли?
 
Andrey Dik:
А в тестере МТ4 комиссии не учитываются что ли?
Кажется чтобы учитывалась надо быть подключенным к счёту с комиссией.
 

Вопрос по функции Print(); как заставить Print() печатать в экспертах данные плюс к ним дату(день) ?  как это решить  ? помогите плиз понять новичку,выкладываю код переделанного ради эксперимента,индюка "пивот" заранее спс!


сам код:  PivotsDaily v2.mq4


#property indicator_chart_window

#property indicator_buffers 3

#property indicator_color1 Lime

#property indicator_color2 Blue

#property indicator_color3 Red


//---- input parameters

extern int CountBars=300;

//---- buffers

double PBuffer[];

double S1Buffer[];

double R1Buffer[];


string Pivot="P",Sup1="S 1", Res1="R 1";


int fontsize=10;

double P,S1,R1,S2,R2,S3,R3;

double LastHigh,LastLow,x;

//+------------------------------------------------------------------+

//| Custor indicator deinitialization function                       |

//+------------------------------------------------------------------+

int deinit()

  {


   ObjectDelete("Pivot");

   ObjectDelete("S1");

   ObjectDelete("R1");

   

   return(0);

  }

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int init()

  {

   string short_name;


   IndicatorBuffers(7);

//---- indicator line

   SetIndexStyle(0,DRAW_ARROW,2,1,Lime);

   SetIndexArrow(0,158);

   SetIndexStyle(1,DRAW_ARROW,2,1,Blue);

   SetIndexArrow(1,158);

   SetIndexStyle(2,DRAW_ARROW,2,1,Red);

   SetIndexArrow(2,158);


    SetIndexBuffer(0,PBuffer);

   SetIndexBuffer(1,S1Buffer);

   SetIndexBuffer(2,R1Buffer);


//---- name for DataWindow and indicator subwindow label

short_name="Pivot";

   IndicatorShortName(short_name);

   SetIndexLabel(0,short_name);

short_name="R1";

   IndicatorShortName(short_name);

   SetIndexLabel(2,short_name);


short_name="S1";

   IndicatorShortName(short_name);

   SetIndexLabel(1,short_name);


   SetIndexDrawBegin(0,6);

//----


   return(0);

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int start()


  {

   int    counted_bars=IndicatorCounted();


   int limit, i;

//---- indicator calculation

if (counted_bars==0)

{

   x=Period();

   if (x>CountBars) return(-1);

     ObjectCreate("Pivot", OBJ_TEXT, 0, 0,0);

     ObjectSetText("Pivot", "        Pivot",10,"Arial",Lime);

     ObjectCreate("S1", OBJ_TEXT, 0, 0, 0);

     ObjectSetText("S1", "      S1",10,"Arial",Blue);

     ObjectCreate("R1", OBJ_TEXT, 0, 0, 0);

     ObjectSetText("R1", "      R1",10,"Arial",Red);

}

   if(counted_bars<0) return(-1);


   limit=(Bars-counted_bars)-1;


       for (i=limit; i>=0;i--)

   if (TimeDayOfWeek(Time[i]) != 0)

{

 if (High[i+1]>LastHigh) LastHigh=High[i+1];

 if (Low[i+1]<LastLow)   LastLow=Low[i+1];

}


if (

    TimeDay(Time[i])!=TimeDay(Time[i+1]) && TimeDayOfWeek(Time[i])!=0

   )

   {

    P=Close[i+1];

    R1 = LastLow;

    S1 = LastHigh;

  

       S2=High[i]-Low[i];

      S3=High[i]-Open[i+1];

  

           if(S3==0)

            {R2 = S3;}  else   {R2 = S2/S3;}

  

Print("R2  ",R2);  //                                           <=   как заставить принт плюс к данным  печатать дату?


   LastLow=Open[i]; LastHigh=Open[i];

   ObjectMove("Pivot", 0, Time[i],P);

   ObjectMove("S1", 0, Time[i],S1);

   ObjectMove("R1", 0, Time[i],R1);

   } 

    PBuffer[i]=P;

    S1Buffer[i]=S1;

    R1Buffer[i]=R1;  

}

//----

   return(0);

  }