Arrows and Curves





//+------------------------------------------------------------------+
//|                                          Arrows and Curves EA.mq4 |
//|           Ïðîñòîé ýêñïåðò èñïîëüçóþùèé èíäèêàòîð Ñòðåëêè è Ëèíèè |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006"
#property link      "kolas@list.ru"

// Ïàðàìåòðû òîðãîâëè äëÿ H4 EURUSD
extern double TrailingStop = 30;
extern double TakeProfit   = 30;
extern double StopLoss     = 80;

// Ïàðàìåòðû èíäèêàòîðà Ñòðåëêè è Ëèíèè
extern int SSP             = 6;     //ïåðèîä ëèíåéíîãî ðàçâîðîòà èíäèêàòîðà
extern int RISK            = 12;
extern int CountBars       = 50;    //ðàñ÷åòíûé ïåðèîä (áîëüøå íå íàäî)
extern double SkyCh        = 23.6;

// Ïàðàìåòðû MM
extern double Slippage     = 3;
extern bool PropotinalLots = false; // Ðåèíâåñòèðîâàíèå
extern double MinDepo      = 100;   // Ìèíèìàëüíûé äåïîçèò
extern double FixedLots    = 0.1;   // Ôèêñèðîâàííûé ðàçìåð îðäåðà
extern double PercentLots  = 10;    // Ïðîöåíò ðåèíâåñòèðîâàíèÿ

// Èäåíòèôèêàöèÿ ýêñïåðòà
extern string NameEA       = "Arrows and Curves";
extern int MAGICNUM        = 123;

double Lots;
double Sloss, Tprof;
bool Buy = false, Sell = false;
static int PrevBar = 0;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init() 
  {return(0);}
  
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit() 
  {return(0);}
  
//+------------------------------------------------------------------+
//|  Ïîëó÷åíèå ñèãíàëîâ íà ïîêóïêó è ïðîäàæó                         |
//+------------------------------------------------------------------+
void Indicators() 
   {                  
      Buy = (iCustom(Symbol(),0,"lukas1 ñòðåëêè è ëèíèè", SSP, RISK, CountBars, SkyCh, 0, 1) > 0) && (Time[0] != PrevBar);
      Sell = (iCustom(Symbol(),0,"lukas1 ñòðåëêè è ëèíèè", SSP, RISK, CountBars, SkyCh, 1, 1) > 0) && (Time[0] != PrevBar);
   }
   
//+------------------------------------------------------------------+
//|  Âûâîä ïðåäóïðåæäåíèÿ îá îòïðàâêå îðäåðà                         |
//+------------------------------------------------------------------+
void prtAlert(string str = "") 
  {
      Print(str);
      Alert(str);
  }
  
//+------------------------------------------------------------------+
//|  Ðàñ÷åò ðàçìåðà îðäåðà                                           |
//+------------------------------------------------------------------+
void LotsSize()
   {
      Lots = FixedLots;
      if (PropotinalLots) Lots = MathCeil(AccountFreeMargin() / 10000 * PercentLots) / 10;
      if (Lots > 10000) Lots = 10000;
   }  
  
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start() 
  {
   // Ïðîâåðêà èñòîðèè
   if(Bars < SSP) 
     {
       Print("Not enough bars for this strategy - ", NameEA);
       return(-1);
     }
   // Ðàñ÷åò çíà÷åíèé èíäèêàòîðà
   Indicators();
   
   // Ðàñ÷åò æåëàåìîãî ðàçìåðà îðäåðà
   LotsSize();   

   // Òðåéëèíã è ðàçâîðîò
   int totalOrders = OrdersTotal();
   int numPos = 0;

   for(int i = 0; i < totalOrders; i++) 
     {
       OrderSelect(i, SELECT_BY_POS);    
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICNUM) 
         {
           numPos++;
           // Ïðîâåðÿåì ïîêóïêó
           if(OrderType() == OP_BUY) 
             {
               // Çàêðûâàåì ïðè ðàçâîðîòå
               if (Sell) 
               {
                  OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Blue); 
                  numPos--;
               }
               else
               // Òðåéëèíã ñòîï
               if(TrailingStop > 0) 
                 {
                   if(Bid - OrderOpenPrice() > TrailingStop*Point) 
                     {
                       if(OrderStopLoss() < (Bid - TrailingStop*Point))
                           OrderModify(OrderTicket(), OrderOpenPrice(), 
                                       Bid - TrailingStop*Point, OrderTakeProfit(), 0, Blue);
                     }
                 }
               
             } 
           else 
             // Ïðîâåðÿåì ïðîäàæó
             {
               // Çàêðûâàåì ïðè ðàçâîðîòå
               if (Buy) 
               {
                  OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Red);
                  numPos--;
               }
               else
               // Òðåéëèíã ñòîï
               if(TrailingStop > 0) 
                 {
                   if(OrderOpenPrice() - Ask > TrailingStop*Point)
                     {
                       if(OrderStopLoss() == 0 || OrderStopLoss() > Ask + TrailingStop*Point)
                           OrderModify(OrderTicket(), OrderOpenPrice(), 
                                       Ask + TrailingStop*Point, OrderTakeProfit(), 0, Red);
                     }           
                 }
             }
         }
     }
     
   // Îòêðûâàåì íîâûå îðäåðà
   if(numPos < 1)
     {   
       // Åñëè ðàçìåð äåïîçèòà óñòðàèâàåò
       if(AccountFreeMargin() < MinDepo)
         {
           Print("Not enough money to trade ", Lots, " lots. Strategy:", NameEA);
           return(0);
         }
       // Åñëè åñòü ñèãíàë íà ïîêóïêó
       if (Buy)
         {
           Sloss = Ask - StopLoss * Point;
           Tprof = Bid + TakeProfit * Point;
           PrevBar = Time[0];
            OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Sloss, Tprof, NameEA + CurTime(), 
                     MAGICNUM, 0, Green);
           prtAlert("Buying"); 
         }
       // Åñëè åñòü ñèãíàë íà ïðîäàæó
       if (Sell) 
         {
           Sloss = Bid + StopLoss * Point;
           Tprof = Ask - TakeProfit * Point;
           PrevBar = Time[0];
            OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, Sloss, Tprof, NameEA + CurTime(), 
                     MAGICNUM, 0, Red);
           prtAlert("Selling"); 
         }
     } 

   return(0);
  }



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar


Indicator Curves created:


Indicators Used:




Custom Indicators Used:
lukas1 стрелки и линии

Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy

Other Features:

It issuies visual alerts to the screen