
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
#define COMMAND 1;
#define LOTS    2;
extern string speed="000";
extern int default_SL=0;
extern int default_TP=0;

extern int Start_Trading=-3;
extern int End_Trading=25;

extern double Point_Factor=0.0001;
extern color BullBarColor = Gray;
extern color BearBarColor = Black;

double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
string Prefix; 
static int tick_delay=0;
static double buy_pos,sell_pos,close_pos,sl_pos,lots_pos,hour_pos,speed_pos,close_all_pos,buy_br_pos,sell_br_pos,delay_pos;
static double Asian_Range_High=0.0000;
static double Asian_Range_Low=9999.0000;
static double text_SL;
static int ticket;
static int prev_time;
static int prev_time_move_SL=0;
static string SubSymbol = "";
extern int left_margin=10;
extern int font_size=12;
static string filename="sim.txt";
static string file_delay_name="simdelay.txt";
//string 	mainData[2][2];
string mainData1COMMAND,mainData1LOTS;
static bool started=false;

string dow[7];
static bool registered=true;
int init()
  {
//----
check_serial();
SubSymbol=Symbol();
   FileDelete("sim.txt");
   Prefix = "OverLayChart" + SubSymbol;

IndicatorShortName( "FXSim" );

SetIndexBuffer( 0, ExtMapBuffer1 );
SetIndexBuffer( 1, ExtMapBuffer2 );
SetIndexBuffer( 2, ExtMapBuffer3 );
SetIndexBuffer( 3, ExtMapBuffer4 );

SetIndexStyle( 0, DRAW_HISTOGRAM, DRAW_LINE, 1, BullBarColor );
SetIndexStyle( 1, DRAW_HISTOGRAM, DRAW_LINE, 1, BearBarColor );
SetIndexStyle ( 2, DRAW_HISTOGRAM, DRAW_LINE, 2, BullBarColor );
SetIndexStyle( 3, DRAW_HISTOGRAM, DRAW_LINE, 2, BearBarColor );

SetIndexEmptyValue( 0, 0.0 );
SetIndexEmptyValue( 1, 0.0 );
SetIndexEmptyValue( 2, 0.0 );
SetIndexEmptyValue( 3, 0.0 );
dow[0]="Sunday";
dow[1]="Monday";
dow[2]="Tuesday";
dow[3]="Wednesday";
dow[4]="Thursday";
dow[5]="Friday";
 speed_pos=50;//(0.95*height)+WindowPriceMin();
 delay_pos=50;
  buy_pos=75;//(0.9*height)+WindowPriceMin();
  buy_br_pos=100;//(0.85*height)+WindowPriceMin();
 sell_pos=125;//(0.80*height)+WindowPriceMin();
  sell_br_pos=150;//(0.75*height)+WindowPriceMin();
 close_pos=175;//(0.70*height)+WindowPriceMin();
  close_all_pos=200;//0.65*height)+WindowPriceMin();
 sl_pos=225;//(0.60*height)+WindowPriceMin();
 lots_pos=225;//(0.55*height)+WindowPriceMin();
return( 0 );
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  //check_serial();
if(!registered)
{

 Comment("Forex Simulator EA Not Registered - Exiting.");
 return(0);
}
 mainData1COMMAND     = "";
Get_Command();
 if(mainData1COMMAND== "")
 {
  return(0);
 }
//----
if(started==false)
{
 FileDelete("sim.txt");
 started=true;
}
if(Time[0]!=prev_time)
{
 //create_brs();
 change_trendline_colour();
 prev_time=Time[0];
 
}







  int count=0;
  get_speed();

 // if(current_hour()>=Start_Trading && current_hour()<=End_Trading)
  {
  while(count<tick_delay)
  {

   count++;
  }
  }



if(mainData1COMMAND=="Buy")
{
  buy(get_sl(),StrToDouble(mainData1LOTS));
}
if(mainData1COMMAND=="Sell")
{
  sell(get_sl(),StrToDouble(mainData1LOTS));
}
if(mainData1COMMAND=="Close")
{
  close(StrToDouble(mainData1LOTS));
}
if(mainData1COMMAND=="Stop Loss")
{
  change_sl();
}
//if(text_SL!=get_sl())
  {
  //  change_sl();
  }
text_SL=get_sl();

change_trendline_colour();


//----
   return(0);
  }
  
  
void Get_Command()
{
 mainData1COMMAND     = "";
 mainData1LOTS     = "";
 int count=0;
 
 while(get_speed()>count)
 {
 count++;
 };
  find_buy();
  find_sell();
  find_close();
  find_close_all();
  find_buy_br();
  find_sell_br();
  create_brs();
  change_sl();
 int FileHandle = FileOpen( filename, FILE_CSV | FILE_READ, "," );
   if ( FileHandle < 0 ) {
  //  Print( "Can\'t open ", filename, ".. the last error is ", GetLastError() );
    return( 0 );
  }
 mainData1COMMAND     = FileReadString( FileHandle );
 mainData1LOTS     = FileReadString( FileHandle );
 FileClose(FileHandle);
 FileDelete("sim.txt");

}
   int current_hour()
 {
  int current_hour=TimeHour(iTime(Symbol(),Period(),0));
  return(current_hour);
 }
  double get_sl()
  {

  string obj_name="SL";
   if(ObjectFind(obj_name)==-1 && default_SL==0)
   {
     ObjectCreate(obj_name,OBJ_HLINE,NULL,Time[WindowFirstVisibleBar()-20],Ask);

    string ask=DoubleToStr(Ask,5);
    ObjectSet(obj_name,OBJPROP_PRICE1,Ask);
   }
   ObjectSet(obj_name,OBJPROP_TIME1,Time[WindowFirstVisibleBar()-20]);
 
   ObjectSet(obj_name,OBJPROP_COLOR,Blue);
   ObjectSet(obj_name,OBJPROP_STYLE,STYLE_DASH);
   double SL=ObjectGet(obj_name,OBJPROP_PRICE1);
   
 
   return(SL);

  }
  
    int get_speed()
  
{


bool readfile=false;
if(readfile)
{
 int FileHandle = FileOpen( file_delay_name, FILE_CSV | FILE_READ, "," );
   if ( FileHandle < 0 ) {
    Print( "Can\'t open ", file_delay_name, ".. the last error is ", GetLastError() );
    return( 0 );
  }else
  {
 string temp     = StrToDouble(FileReadString( FileHandle) );
 int tempint=StrToInteger(temp);
 if (tempint>-1)
 {
  tick_delay=tempint;
 }

}
 FileClose(FileHandle);
 FileDelete(file_delay_name);
}
else

{
  string obj_name="Delay";
   if(ObjectFind(obj_name)==-1)
   {
     ObjectCreate(obj_name,OBJ_LABEL,NULL,Time[WindowFirstVisibleBar()-20],WindowPriceMax()-Point*300);
     ObjectSetText(obj_name,"0");
   }
      ObjectSet(obj_name,OBJPROP_COLOR,Black);
   ObjectSet(obj_name,OBJPROP_FONTSIZE,font_size);
   ObjectSet(obj_name,OBJPROP_XDISTANCE,left_margin);
   ObjectSet(obj_name,OBJPROP_YDISTANCE,delay_pos);
   string ticksstr=ObjectDescription( obj_name);
   double tick_delay=StrToDouble(ticksstr);

   

}


 return(tick_delay);
}
  double lots()
  {
 
  string obj_name="LOTS";
   if(ObjectFind(obj_name)==-1)
   {
     ObjectCreate(obj_name,OBJ_LABEL,NULL,Time[WindowFirstVisibleBar()-20],WindowPriceMax()-Point*300);
     ObjectSetText(obj_name,"0");
   }
      ObjectSet(obj_name,OBJPROP_COLOR,Black);
   ObjectSet(obj_name,OBJPROP_FONTSIZE,font_size);
   ObjectSet(obj_name,OBJPROP_XDISTANCE,left_margin);
   ObjectSet(obj_name,OBJPROP_YDISTANCE,lots_pos);
   string lotsstr=ObjectDescription( obj_name);
   double lots=StrToDouble(lotsstr);

   return(lots);
  }
  bool close(double lots )
  {
   
   OrderSelect(0, SELECT_BY_POS);
   ticket=OrderTicket();

   if(OrderType()==OP_BUY)
   {
  
   OrderClose(ticket,lots,Bid,100);
   }
   else
   {
   
    OrderClose(ticket,lots,Ask,100);
   }
  }
  
      bool find_close()
  {
   string obj_name="CLOSE";
    bool found=false;
   ObjectSet(obj_name,OBJPROP_XDISTANCE,left_margin);
   ObjectSet(obj_name,OBJPROP_YDISTANCE,close_pos);

    ObjectSetText(obj_name,"CLOSE");
     ObjectSet(obj_name,OBJPROP_COLOR,Black);
   ObjectSet(obj_name,OBJPROP_FONTSIZE,font_size);
    if(ObjectFind(obj_name)!=-1)
    {
     found=true;
   
    }
    else
    {
     found=false;
     ObjectCreate(obj_name,OBJ_LABEL,NULL,Time[WindowFirstVisibleBar()-20],WindowPriceMax()-Point*300,NULL,Navy);
     ObjectSetText(obj_name,"CLOSE");
       
    int count=0;
//omment("close");
     close(lots());

     
    }
     
  }
        bool find_close_all()
  {
   string obj_name="CLOSE_ALL";
    bool found=false;
   ObjectSet(obj_name,OBJPROP_XDISTANCE,left_margin);
   ObjectSet(obj_name,OBJPROP_YDISTANCE,close_all_pos);
    ObjectSetText(obj_name,"CLOSE ALL");
     ObjectSet(obj_name,OBJPROP_COLOR,Black);
   ObjectSet(obj_name,OBJPROP_FONTSIZE,font_size);
    if(ObjectFind(obj_name)!=-1)
    {
     found=true;
   
    }
    else
    {
     found=false;
     ObjectCreate(obj_name,OBJ_LABEL,NULL,Time[WindowFirstVisibleBar()-20],WindowPriceMax()-Point*300);
     ObjectSetText(obj_name,"CLOSE ALL");
         
    int count=0;
//omment("close");
while(OrdersTotal()>0)
{
     close(lots());
}
     
    }
     
  }
  
  void change_sl()
  {

   
   if(Time[0]!=prev_time_move_SL && default_SL==0)
   {
   int count=0;
   while(count<OrdersTotal())
   {
   OrderSelect(count,SELECT_BY_POS);
   ticket=OrderTicket();
 
   OrderModify(OrderTicket(),OrderOpenPrice(),get_sl(),OrderTakeProfit(),0,Blue);
   count++;
   }
    prev_time_move_SL=Time[0];
   }
  }
  
  
   bool find_sell()
  {
   string obj_name="SELL";
    bool found=false;
       ObjectSet(obj_name,OBJPROP_XDISTANCE,left_margin);
   ObjectSet(obj_name,OBJPROP_YDISTANCE,sell_pos);
    ObjectSetText(obj_name,"SELL");
    
       ObjectSet(obj_name,OBJPROP_COLOR,Black);
   ObjectSet(obj_name,OBJPROP_FONTSIZE,font_size);
    if(ObjectFind(obj_name)!=-1)
    {
     found=true;
   
    }
    else
    {
     found=false;
     ObjectCreate(obj_name,OBJ_LABEL,NULL,Time[WindowFirstVisibleBar()-20],sell_pos);
     ObjectSetText(obj_name,"SELL");
    
    int count=0;
      int start_count=OrdersTotal();
    {
     sell(get_sl(),lots());
     count++;
     }
    }
     
  }
  
    bool find_sell_br()
  {
   string obj_name="SELL_BR";
    bool found=false;
       ObjectSet(obj_name,OBJPROP_XDISTANCE,left_margin);
   ObjectSet(obj_name,OBJPROP_YDISTANCE,sell_br_pos);
    ObjectSetText(obj_name,"SELL on Break");

       ObjectSet(obj_name,OBJPROP_COLOR,Black);
   ObjectSet(obj_name,OBJPROP_FONTSIZE,font_size);
    if(ObjectFind(obj_name)!=-1)
    {
     found=true;
   
    }
    else
    {
     found=false;
     if(Low[0]<Low[1])
     {
     ObjectCreate(obj_name,OBJ_LABEL,NULL,Time[WindowFirstVisibleBar()-20],sell_br_pos);
     ObjectSetText(obj_name,"SELL on Break");
    
    int count=0;
      int start_count=OrdersTotal();

    {
     sell(get_sl(),lots());
     count++;
     }
     }
    }
     
  }
  
  bool find_buy()
  {
   string obj_name="BUY";
    bool found=false;
   ObjectSet(obj_name,OBJPROP_XDISTANCE,left_margin);
   ObjectSet(obj_name,OBJPROP_YDISTANCE,buy_pos);
    ObjectSetText(obj_name,"BUY");

       ObjectSet(obj_name,OBJPROP_COLOR,Black);
   ObjectSet(obj_name,OBJPROP_FONTSIZE,font_size);

    if(ObjectFind(obj_name)!=-1)
    {
     found=true;
   
    }
    else
    {
     found=false;
     ObjectCreate(obj_name,OBJ_LABEL,NULL,Time[WindowFirstVisibleBar()-20],buy_pos);
     ObjectSetText(obj_name,"BUY");
     ObjectSet(obj_name,OBJPROP_PRICE1,buy_pos);
     
       
    int start_count=OrdersTotal();

    int count=0;

    {

     buy(get_sl(),lots());
    count++;
     }
    }
     
  }
  void create_brs()
  {
       string obj_name="BUY_BR";
         ObjectCreate(obj_name,OBJ_LABEL,NULL,Time[WindowFirstVisibleBar()-20],buy_br_pos);
     ObjectSetText(obj_name,"BUY on Break");
   ObjectSet(obj_name,OBJPROP_XDISTANCE,left_margin);
   ObjectSet(obj_name,OBJPROP_YDISTANCE,buy_br_pos);
       ObjectSet(obj_name,OBJPROP_COLOR,Black);
   ObjectSet(obj_name,OBJPROP_FONTSIZE,font_size);
   obj_name="SELL_BR";
     ObjectCreate(obj_name,OBJ_LABEL,NULL,Time[WindowFirstVisibleBar()-20],sell_br_pos); 
       ObjectSet(obj_name,OBJPROP_XDISTANCE,left_margin);
   ObjectSet(obj_name,OBJPROP_YDISTANCE,sell_br_pos);
    ObjectSetText(obj_name,"SELL on Break");

       ObjectSet(obj_name,OBJPROP_COLOR,Black);
   ObjectSet(obj_name,OBJPROP_FONTSIZE,font_size);
  }

   bool find_buy_br()
  {
   string obj_name="BUY_BR";
    bool found=false;
       ObjectSet(obj_name,OBJPROP_XDISTANCE,left_margin);
   ObjectSet(obj_name,OBJPROP_YDISTANCE,buy_br_pos);
    ObjectSetText(obj_name,"BUY on Break");

       ObjectSet(obj_name,OBJPROP_COLOR,Black);
   ObjectSet(obj_name,OBJPROP_FONTSIZE,font_size);

    if(ObjectFind(obj_name)!=-1)
    {
     found=true;
   
    }
    else
    {
     found=false;
     if(High[0]>High[1])
     {
        ObjectSet(obj_name,OBJPROP_XDISTANCE,left_margin);
   ObjectSet(obj_name,OBJPROP_YDISTANCE,buy_br_pos);
     ObjectSetText(obj_name,"BUY on Break");

     

    int start_count=OrdersTotal();

    int count=0;

 //   while(OrdersTotal()<(start_count+lots()) && count<100)
    {

     buy(get_sl(),lots());
    count++;
     }
    }
    }
     
  }



 
 void buy(double SL, double lots )
 {
 int TakeProfit=300;
  double TP=NULL;
 if(default_SL!=0) SL=Ask-Point*default_SL;
  if(default_TP!=0) TP=Ask+Point*default_TP;


 if(OrdersTotal()==0)
 {
 int ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,3,SL,TP,"LiveTest",16384,0,DeepPink);
 }

 }
 
  void sell(double SL ,double lots )
 {
 int TakeProfit=300;
   double TP=NULL;
  if(default_SL!=0) SL=Bid+Point*default_SL;
  if(default_TP!=0) TP=Bid-Point*default_TP;
 if(OrdersTotal()==0)
 { int ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,3,SL,TP,"LiveTest",16384,0,Black);
 }

 }
 

 

 string bull_bear(int i)
 {
 string bull_bear="None";
 if( Open[i]<Close[i])
 {
  bull_bear="Bull";
 }
 else
 {
  bull_bear="Bear";
 }
 return(bull_bear);
 }
 
 bool existing_orders()
 {
 
 }
 
 void change_trendline_colour()
 {

   for( int n=ObjectsTotal()-1; n>=0; n-- ){
      string str= ObjectName(n);

      if( ObjectType(str) == OBJ_TREND )
      {
      
      if( StringGetChar(str,0) == '#' )
   {

      ObjectSet(str,OBJPROP_COLOR,Black);
      ObjectSet(str,OBJPROP_WIDTH,2);
      ObjectSet(str,OBJPROP_STYLE,0);

      }
      }
      
     if( ObjectType(str) == OBJ_ARROW )
      {
      
      if( StringGetChar(str,0) == '#' )
   {


      }
      }
      
   }
   
   return(0);
}

void show_hour()
{
string obj_name="Hour";
 double height=WindowPriceMax()-WindowPriceMin();

  double hour_level=(0.1*height); 
 double hour_pos=(0.95*height)+WindowPriceMin();
     ObjectCreate(obj_name,OBJ_TEXT,NULL,Time[0],Ask+(hour_level));

    int curr_hour=TimeHour(Time[0]);
    curr_hour=TimeHour(iTime(Symbol(),Period(),0));

    ObjectSetText(obj_name,DoubleToStr(curr_hour,0),0);
  
   ObjectSet(obj_name,OBJPROP_TIME1,Time[0]);
   if(Ask+(hour_level)>WindowPriceMax())
   {
   ObjectSet(obj_name,OBJPROP_PRICE1,Ask-(hour_level));
   }
   else
   {
    ObjectSet(obj_name,OBJPROP_PRICE1,Ask+(hour_level));
   }
   ObjectSet(obj_name,OBJPROP_COLOR,Black);
   ObjectSet(obj_name,OBJPROP_FONTSIZE,font_size);
}
 
bool check_serial()
{
 
 string filenamemagpie="magpie.txt";
 int serial;
 int FileHandle = FileOpen( filenamemagpie, FILE_CSV | FILE_READ, "," );
 if ( FileHandle < 0 ) 
  {
    Print( "Can\'t open ", filenamemagpie, ".. the last error is ", GetLastError() );
    return( 0 );
  }
  else
  {
    string temp     = StrToDouble(FileReadString( FileHandle) );
    if(StrToDouble(temp)>0)
    {
     serial=StrToDouble(temp);
    }
    FileClose(FileHandle);
    string straccno;
    straccno=DoubleToStr(AccountNumber( 	),0);
    int count=0;
    int serial_calc=0;
   
    int digit=0;
    while (count<StringLen(straccno))
    {
    
     digit=StrToInteger(StringSubstr(straccno,count,1));
     //Alert(digit);
   
     {
     serial_calc=serial_calc+digit;
     
     }
     if(count==2)
     {
      serial_calc=(serial_calc*28);
    
     }
      if(count==5)
     {
       serial_calc=(serial_calc*184);
     }
     if(count==4)
     {
     serial_calc=serial_calc*14;
     }
     count++;
    }
   }
 
   if(serial==serial_calc)
   {
 
    registered=true;
   }
   return(0);
}
//+------------------------------------------------------------------+