//+------------------------------------------------------------------+
//|                                         Подручный Властелина.mq4 |
//|                                                           Ttomas |
//|                                                 TradeLikeAPro.ru |
//+------------------------------------------------------------------+
#property copyright "Ttomas"
#property link      "TradeLikeAPro.ru"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Green
#property indicator_width1 2
extern string FileName="Пробный файл";
extern int OsnTp=200;         //Фиксированный Тейк профит если не указан закроется только по сл или противоположном сигнале
extern int OsnSl=200;          //стоп лос если тело свечи меньше данного стоп лоса то используется он
extern int LastRes=0;
extern int AnalizeBar=100;
extern bool debag=True;
static bool Status=false, StatOrd;
static int Type=-1;
static double Cena=-1;
static double TP=-1;
static double SL=-1;
static double Buf1[];
static int Handle, Qnt_Symb;
int init()
   {
   IndicatorBuffers(1);
   SetIndexBuffer(0,Buf1);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexEmptyValue(0,0.0);
   IndicatorShortName("Подручный Властелина");
   MathSrand(GetTickCount()); 
   if (LastRes==0) LastRes=Bars;
   FileName=FileName+".csv";
   Handle=FileOpen(FileName,FILE_CSV|FILE_READ|FILE_WRITE,";");//Открытие файла
   if (Handle==-1)                      // Неудача при открытии файла
     {
      Print("Ошибка при открытии файла. ",// Сообщение об ошибке 
              "Возможно, файл занят другим приложением");
                            // Выход из start()      
     }
   return(0);
   }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----   
   FileClose(Handle);    
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   int limit = Bars - counted_bars -1;
   Buf1[Bars-1]=0; 
   Buf1[Bars]=0; 
   for (int shift =limit; shift >= 0; shift--)
      {
      if(debag) Print ("НАчало цикла расчета ", shift);
      GSCh();
      if(debag) Print ("ГСЧ уже отработал ", StatOrd);
      if (shift>=LastRes) {Buf1[shift]=0; continue;} 
      if (StatOrd==True && Status==false) 
      {if(debag) Print ("Сигнал покупки");OpenOrderBuy(shift);}
      if (StatOrd==false && Status==false) 
      {if(debag) Print ("Сигнал продажи");OpenOrderSell(shift);}   
      if (Status==True)
         {
         if(debag) Print ("Есть текущий открытый ордер ", Type);
         if (Type==OP_BUY && (Close[shift]+MarketInfo(Symbol(),MODE_SPREAD)*Point<=SL || Low[shift]+MarketInfo(Symbol(),MODE_SPREAD)*Point<=SL)) WorkFile(false, shift);
         if (Type==OP_BUY && (Close[shift]+MarketInfo(Symbol(),MODE_SPREAD)*Point>=TP || High[shift]+MarketInfo(Symbol(),MODE_SPREAD)*Point>=TP)) WorkFile(TRUE, shift);
         if (Type==OP_SELL && (Close[shift]>=SL || High[shift]>=SL)) WorkFile(false, shift);
         if (Type==OP_SELL && (Close[shift]<=TP || Low[shift]<=TP)) WorkFile(TRUE, shift); 
         if(debag) Print ("Предыдущий ордер незакрылся ни по ТП ни по СЛ");  
         Buf1[shift]=Buf1[shift+1];
         } 
      if (Status==false) Buf1[shift]=Buf1[shift+1];  
      Print ("Значение в буфере ", Buf1[shift]);    
      }

   return(0);
  }
//+------------------------------------------------------------------+
void GSCh()
   {
   double Random=MathRand()/32767.0;
   if (Random>0.5) {StatOrd=True;return;} 
   StatOrd=False;
   return;
   }   
//-------------Функция открытия BUY отрдера-----------------------  1
void OpenOrderBuy(int k)
   {
      if(debag) Print ("Функция открытия ордера Бай");
   Status=True;
   Type=OP_BUY;
   Cena=Close[k]+MarketInfo(Symbol(),MODE_SPREAD)*Point;
   TP=Cena+OsnTp*Point;
   SL=Cena-OsnSl*Point;
      if(debag) Print ("ТП, ",TP ," СЛ, ",SL);
   return;                                   
   }   
 //--------конец функции открытия BUY отрдера-----------------------   
 //-------------Функция открытия Sell отрдера----------------------- 1 
void OpenOrderSell(int k) 
   {
      if(debag) Print ("Функция открытия ордера Селл");
   Status=True;
   Type=OP_SELL;
   Cena=Close[k];
   TP=Cena-(OsnTp+MarketInfo(Symbol(),MODE_SPREAD))*Point;
   SL=Cena+(OsnSl+MarketInfo(Symbol(),MODE_SPREAD))*Point; 
      if(debag) Print ("ТП, ",TP ," СЛ, ",SL);
   return;                                     
   }   
void WorkFile(bool T, int k)
   {
   if (T==True) 
   {Qnt_Symb=FileWrite(Handle, Type,Cena,TP,SL,"1");}//Запись в файл
   if (T==False) 
   {Qnt_Symb=FileWrite(Handle, Type,Cena,TP,SL,"0");}//Запись в файл
   if(Qnt_Symb < 0)    
      if(debag) Print ("Запись информации о ордере");
   if (T==True) {Print ("был Тейк профит");Buf1[k]=1;}//Запись в файл
   if (T==False) {Print ("Был стоп лосс");Buf1[k]=0;}//Запись в файл
   Status=false;
   Type=-1;
   Cena=-1;
   TP=-1;
   SL=-1;   
      if(debag) Print ("Все записано и обнулено");
   return;                                     
   }   