Activate pending order when the bar close under him. - page 2

 
Fernando Carreiro:

Also note that you cannot access "P" from the EA. You can only access the Indicators "buffers", so you indicator code has to written correctly in order to store the required infomation in the "buffers" (arrays).


Ok so in this case i use the PBuffer used in the indicator script,right?

 
Fernando Carreiro:

You access the Indicator data from the EA by using the iCustom() function.

I suggest you first have a look at the many examples in the CodeBase section and really go through the documentation thoroughly.


Thanks a lot.

 
domdix27: Ok so in this case i use the PBuffer used in the indicator script,right?

Please read the documentation on iCustom() else you are just guessing at things and the questions you have will not make sense.

Also, run a search on the forum on the this function, as there are many, many posts with newbie coders asking exactly the same thing over and over again.

So, do some research first and look at the many examples available!

iCustom - Technical Indicators - MQL4 Reference
iCustom - Technical Indicators - MQL4 Reference
  • docs.mql4.com
iCustom - Technical Indicators - MQL4 Reference
 
Fernando Carreiro:

Please read the documentation on iCustom() else you are just guessing at things and the questions you have will not make sense.

Also, run a search on the forum on the this function, as there are many, many posts with newbie coders asking exactly the same thing over and over again.

So, do some research first and look at the many examples available!


Okay sorry and thanks.

I search and I made this (for now) it is correct?

void OnStart(){

double DailyPivot = iCustom(NULL,0,"pivots"\*the name of the indicator*/,0/*the indicator dont have input parameters*/,0/*number of the p*/buffer,0/* no variable*/);



if(Bid+1*Point >= DailyPivot && Bid-1*Point <= DailyPivot){

  Alert("It is there");
      


}
}
 
domdix27: Okay sorry and thanks. I search and I made this (for now) it is correct?

No! EAs don't use the OnStart() event. They use the OnTick() event.

As for the rest, it is very "messy" and don't use hard coded values. Use something like this:

// Untested Code just as example
double dblDailyPivot = iCustom( _Symbol, PERIOD_CURRENT, strIndicatorName, ... ,intBufferIndex, intBarShift );
 
Fernando Carreiro:

No! EAs don't use the OnStart() event. They use the OnTick() event.

As for the rest, it is very "messy" and don't use hard coded values. Use something like this:


Okay now I have redone it thanks for the patience.

int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }



void OnTick()
  {
double DailyPivot = iCustom(_Symbol,PERIOD_CURRENT,"pivots",0,0,0);//the first 0 is why in the indicator script there aren't input parametres ,the second is the number of the buffer .



if(Bid+1*Point >= DailyPivot && Bid-1*Point <= DailyPivot){

  Alert("It is there");
   
  }

and this is the indicator script 

#property indicator_chart_window
//#property indicator_separate_window
#property indicator_buffers 7
#property indicator_color1  MediumBlue
#property indicator_color2  DarkGreen
#property indicator_color3  FireBrick
#property indicator_color4  DarkGreen
#property indicator_color5  FireBrick
#property indicator_color6  DarkGreen
#property indicator_color7  FireBrick
#property  indicator_width1  1
#property  indicator_width2  1
#property  indicator_width3  1
#property  indicator_width4  1
#property  indicator_width5  1
#property  indicator_width6  1
#property  indicator_width7  1
//---- input parameters

//---- buffers
double PBuffer[];
double S1Buffer[];
double R1Buffer[];
double S2Buffer[];
double R2Buffer[];
double S3Buffer[];
double R3Buffer[];
string Pivot = "Pivot Point", Sup1 = "S 1", Res1 = "R 1";
string Sup2="S 2", Res2="R 2", Sup3="S 3", Res3="R 3";
int fontsize = 10;
double P, S1, R1, S2, R2, S3, R3;
double LastHigh, LastLow, x;
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   ObjectDelete("Pivot");
   ObjectDelete("Sup1");
   ObjectDelete("Res1");
   ObjectDelete("Sup2");
   ObjectDelete("Res2");
   ObjectDelete("Sup3");
   ObjectDelete("Res3");   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicator line
   SetIndexStyle(0, DRAW_LINE);
   SetIndexStyle(1, DRAW_LINE);
   SetIndexStyle(2, DRAW_LINE);
   SetIndexStyle(3, DRAW_LINE);
   SetIndexStyle(4, DRAW_LINE);
   SetIndexStyle(5, DRAW_LINE);
   SetIndexStyle(6, DRAW_LINE);
   SetIndexBuffer(0, PBuffer);
   SetIndexBuffer(1, S1Buffer);
   SetIndexBuffer(2, R1Buffer);
   SetIndexBuffer(3, S2Buffer);
   SetIndexBuffer(4, R2Buffer);
   SetIndexBuffer(5, S3Buffer);
   SetIndexBuffer(6, R3Buffer);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("Pivot Point");
   SetIndexLabel(0, "Pivot Point");
//----
   SetIndexDrawBegin(0,1);
//----
   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 > 240) 
           return(-1);
       ObjectCreate("Pivot", OBJ_TEXT, 0, 0, 0);
       ObjectSetText("Pivot", "                 Pivot Point", fontsize, "Arial", MediumBlue);
       ObjectCreate("Sup1", OBJ_TEXT, 0, 0, 0);
       ObjectSetText("Sup1", "      S 1", fontsize, "Arial", DarkGreen);
       ObjectCreate("Res1", OBJ_TEXT, 0, 0, 0);
       ObjectSetText("Res1", "      R 1", fontsize, "Arial", FireBrick);
       ObjectCreate("Sup2", OBJ_TEXT, 0, 0, 0);
       ObjectSetText("Sup2", "      S 2", fontsize, "Arial", DarkGreen);
       ObjectCreate("Res2", OBJ_TEXT, 0, 0, 0);
       ObjectSetText("Res2", "      R 2", fontsize, "Arial", FireBrick);
       ObjectCreate("Sup3", OBJ_TEXT, 0, 0, 0);
       ObjectSetText("Sup3", "      S 3", fontsize, "Arial", DarkGreen);
       ObjectCreate("Res3", OBJ_TEXT, 0, 0, 0);
       ObjectSetText("Res3", "      R 3", fontsize, "Arial", FireBrick);
     }
   if(counted_bars < 0) 
       return(-1);
   //---- last counted bar will be recounted
   //   if(counted_bars>0) counted_bars--;
   limit = (Bars - counted_bars) - 1;
//----
   for(i = limit; i >= 0; i--)
     { 
       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]))
         { 
           P = (LastHigh + LastLow + Close[i+1]) / 3;
           R1 = (2*P) - LastLow;
           S1 = (2*P) - LastHigh;
           R2 = P + (LastHigh - LastLow);
           S2 = P - (LastHigh - LastLow);
           R3 = (2*P) + (LastHigh - (2*LastLow));
           S3 = (2*P) - ((2* LastHigh) - LastLow); 
           LastLow = Open[i]; 
           LastHigh = Open[i];
           //----
           ObjectMove("Pivot", 0, Time[i], P);
           ObjectMove("Sup1", 0, Time[i], S1);
           ObjectMove("Res1", 0, Time[i], R1);
           ObjectMove("Sup2", 0, Time[i], S2);
           ObjectMove("Res2", 0, Time[i], R2);
           ObjectMove("Sup3", 0, Time[i], S3);
           ObjectMove("Res3", 0, Time[i], R3);
         }
       PBuffer[i] = P;
       S1Buffer[i] = S1;
       R1Buffer[i] = R1;
       S2Buffer[i] = S2;
       R2Buffer[i] = R2;
       S3Buffer[i] = S3;
       R3Buffer[i] = R3;
     }
     
     

//----
return(0);
}

It is right now?

 
domdix27:

Okay now I have redone it thanks for the patience.

and this is the indicator script 

It is right now?

Test it yourself first in order to learn to diagnose problems:

  • See the results of the Compilation ...
  • See Results of Run-time ...
  • Debug it or Test in the Strategy Tester ....
  • Research problems and check documentation ...
  • ... and repeat cycle

That is how most coders do things.

Then if you are still stuck, return here with the specific problem you can't solve yourself.

 
Fernando Carreiro:

Test it yourself first in order to learn to diagnose problems:

  • See the results of the Compilation ...
  • See Results of Run-time ...
  • Debug it or Test in the Strategy Tester ....
  • Research problems and check documentation ...
  • ... and repeat cycle

That is how most coders do things.

Then if you are still stuck, return here with the specific problem you can't solve yourself.

Thanks.

So, i do this and..

Compilation 0 errors.

I have no error .

strategy tester..  now is the problem he give me an alert every millisecond what can I do?


this is my code now

#include <stderror.mqh>
#include <stdlib.mqh>
#define PivotPoint "PivotPoint"

#define  PivotPoint_P 0
extern int x = 1;

int OnInit()
  {

//----
   return(0);
   return(INIT_SUCCEEDED);
  }


void OnTick ()
 
  {
  //int Spread=(Ask-Bid);
  string text;
int check;
    SendMail("Test", text);
double DailyPivot = iCustom(_Symbol,PERIOD_CURRENT,"PivotPoint",x,PivotPoint_P,0);


   check=GetLastError();
   if(check!=ERR_NO_ERROR) Print("Message not sent. Error: ",ErrorDescription(check));

if(Bid+1*Point >= DailyPivot )/*&&*/ {

   Alert("here");
  //int ticket = OrderSend(Symbol(),OP_BUY,0.10,Ask,3,Bid-30*Point+Spread,Bid+30*Point+Spread,"Buy Order",0,0,Blue);
   
  }
if(Bid-1*Point <= DailyPivot)

{
 Alert("here");
//int ticket = OrderSend(Symbol(),OP_SELL,0.10,Bid,3,(Ask+30*Point)+Spread,Ask-30*Point +Spread,"Buy Order",0,0,Blue);

}
  
 
domdix27:
Thanks.

So, i do this and..

Compilation 0 errors.

I have no error .

strategy tester..  now is the problem he give me an alert every millisecond what can I do?

this is my code now

Lets take some time to think - lets use logic.

The OnTick() event gets called when? That is right - on EVERY TICK. So if during one bar there is a volume 1000 ticks, it gets called 1000 times per bar.

Now in this Event handler function OnTick(), you check a condition and when it is true, it calls the Alert. However, the condition will remain true for many, many, many more ticks until it is no longer true. So, it stands to reason, that the alert appears many, many, many times.

So, what must you do? What does logic dictate? How should you only show the alert once per condition?

You must set a flag (boolean), and check that flag to prevent showing the alert again, until the condition is over and at that time you can reset the flag.

Now, do you think you can translate these words into actual code?

//Skeleton code for example. Untested!

static bool AlertFlag = true;

if( condition )
{
   if( AlertFlag )
   {
      Alert( ... );
      AlertFlag = false;
   }
}
else
   AlertFlag = true;     

This is what coding is about! You have to learn to think logically step-by-step and make a "recipe" of what must be done for every single step. That is why coding is NOT easy (it takes years to become a pro)!

It is difficult for beginners and you have to develop your skills by learning a lot, by reading a lot, by doing plenty of research, and practicing many projects.

 
Fernando Carreiro:

Lets take some time to think - lets use logic.

The OnTick() event gets called when? That is right - on EVERY TICK. So if during one bar there is a volume 1000 ticks, it gets called 1000 times per bar.

Now in this Event handler function OnTick(), you check a condition and when it is true, it calls the Alert. However, the condition will remain true for many, many, many more ticks until it is no longer true. So, it stands to reason, that the alert appears many, many, many times.

So, what must you do? What does logic dictate? How should you only show the alert once per condition?

You must set a flag (boolean), and check that flag to prevent showing the alert again, until the condition is over and at that time you can reset the flag.

Now, do you think you can translate these words into actual code?

This is what coding is about! You have to learn to think logically step-by-step and make a "recipe" of what must be done for every single step. That is why coding is NOT easy (it takes years to become a pro)!

It is difficult for beginners and you have to develop your skills by learning a lot, by reading a lot, by doing plenty of research, and practicing many projects.


thanks a lot . I try

Reason: