Selaa lähdekoodia

Ticket # 1483

Add stop loss , get lot and take profit
AhtashamShahzad3 2 vuotta sitten
vanhempi
sitoutus
e72926147f
2 muutettua tiedostoa jossa 112 lisäystä ja 39 poistoa
  1. BIN
      BOS_CHOCH.ex5
  2. 112 39
      BOS_CHOCH.mq5

BIN
BOS_CHOCH.ex5


+ 112 - 39
BOS_CHOCH.mq5

@@ -11,6 +11,14 @@ CTrade  trade;
 
 #define orderNum 200
 
+
+enum lotcalculator
+  {
+   fix, //Fixed Lot Size
+   rsk, //Risk Percentage
+  };
+
+
 struct tradeOrder
   {
 
@@ -43,7 +51,7 @@ enum entryCondition
    two,      // Entry A2
   };
 
-input entryCondition Entry_condition_1 = one;   // Entry Condition
+// input entryCondition Entry_condition_1 = one;   // Entry Condition
 
 sinput      string                str                    = "<><><><><><> Set Object Name <><><><><><>";
 input       string                object_name            = "line";
@@ -54,9 +62,12 @@ input       datetime             inpTime                 = 0;//First Line Draw t
 
 sinput      string               str2                    = "<><><><><><> Default Settings <><><><><><>";
 input       double               lot_size                = 0.1;
-input       double               stoploss                = 20;
-input       double               takeProfit              = 20;
-input       int                  magic_no                = 123;
+input lotcalculator lot_calculator = fix; //Lot Size Calculator
+
+input double risk = 1; //Risk in Percentage %
+input       double               stoploss                = 20;   // Stoploss Pips buffer from choch candle
+input       double               takeProfit              = 20;   // TakeProfit in Pips
+input       int                  magic_no                = 123;   //  Magic no
 
 
 
@@ -602,7 +613,10 @@ void choch(int i)
             ObjectDelete(0,"target line");
            }
 
-         ObjectCreate(0,"target line",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,chock_index),iHigh(Symbol(),PERIOD_CURRENT,chock_index),iTime(Symbol(),PERIOD_CURRENT,0),iHigh(Symbol(),PERIOD_CURRENT,chock_index));
+         if(!ObjectCreate(0,"target line",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,chock_index),iHigh(Symbol(),PERIOD_CURRENT,chock_index),iTime(Symbol(),PERIOD_CURRENT,0),iHigh(Symbol(),PERIOD_CURRENT,chock_index)));
+           {
+            Print("object error ",GetLastError());
+           }
          ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
          ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
 
@@ -622,7 +636,7 @@ void choch(int i)
          Print("from where you end ",chock_index1);
 
          bool condition_not_match = false;
-         for(int p=chock_index +1 ; p >=chock_index1; p--)
+         for(int p=chock_index - 1 ; p >=chock_index1; p--)
            {
             if(iLow(Symbol(),PERIOD_CURRENT,p) < HIGH)
               {
@@ -634,6 +648,7 @@ void choch(int i)
            {
             HIGH = 0.0;
             LOW = 0.0;
+            Print("TArget line deleted");
             condition_not_match = false;
 
             if(object_find("target line") > 0)
@@ -775,7 +790,10 @@ void choch(int i)
             ObjectDelete(0,"target line");
            }
 
-         ObjectCreate(0,"target line",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,chock_index),iHigh(Symbol(),PERIOD_CURRENT,chock_index),iTime(Symbol(),PERIOD_CURRENT,0),iHigh(Symbol(),PERIOD_CURRENT,chock_index));
+         if(!ObjectCreate(0,"target line",OBJ_TREND,0,iTime(Symbol(),PERIOD_CURRENT,chock_index),iHigh(Symbol(),PERIOD_CURRENT,chock_index),iTime(Symbol(),PERIOD_CURRENT,0),iHigh(Symbol(),PERIOD_CURRENT,chock_index)));
+           {
+            Print("object error ",GetLastError());
+           }
          ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
          ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
 
@@ -795,7 +813,7 @@ void choch(int i)
          Print("from where you end ",chock_index1);
 
          condition_not_match = false;
-         for(int p=chock_index +1 ; p >=chock_index1; p--)
+         for(int p=chock_index - 1 ; p >=chock_index1; p--)
            {
             if(iLow(Symbol(),PERIOD_CURRENT,p) < HIGH)
               {
@@ -805,6 +823,7 @@ void choch(int i)
 
          if(condition_not_match == true)
            {
+            Print("TArget line deleted");
             HIGH = 0.0;
             LOW = 0.0;
             condition_not_match = false;
@@ -988,7 +1007,7 @@ void choch(int i)
          Print("from where you end ",chock_index1);
 
          bool condition_not_match = false;
-         for(int p=chock_index +1 ; p >=chock_index1; p--)
+         for(int p=chock_index -  1 ; p >=chock_index1; p--)
            {
             if(iHigh(Symbol(),PERIOD_CURRENT,p) > LOW)
               {
@@ -998,6 +1017,7 @@ void choch(int i)
 
          if(condition_not_match == true)
            {
+            Print("line target deleted :");
             HIGH = 0.0;
             LOW = 0.0;
             condition_not_match = false;
@@ -1160,7 +1180,7 @@ void choch(int i)
          Print("from where you end ",chock_index1);
 
          condition_not_match = false;
-         for(int p=chock_index +1 ; p >=chock_index1; p--)
+         for(int p=chock_index - 1 ; p >=chock_index1; p--)
            {
             if(iHigh(Symbol(),PERIOD_CURRENT,p) > LOW)
               {
@@ -1172,6 +1192,7 @@ void choch(int i)
            {
             HIGH = 0.0;
             LOW = 0.0;
+            Print("line target deleted :");
             condition_not_match = false;
 
             if(object_find("target line") > 0)
@@ -1754,16 +1775,19 @@ void placeBuyTrade()
    double sell_SL = 0,sell_Tp = 0, openPrice = 0,buySL = 0, buyTp = 0;
    openPrice = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
    double Ask = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
-
-   if(stoploss != 0)
-     {
-      buySL = Ask - (stoploss *10* Point());
-     }
+   int  ch = iBarShift(Symbol(), PERIOD_CURRENT,choch_index_time,false);  // get high of chock index
+   buySL = iLow(Symbol(),PERIOD_CURRENT,ch) - stoploss *10 * Point();
+//
+//   if(stoploss != 0)
+//     {
+//      buySL = Ask - (stoploss *10* Point());
+//     }
    if(takeProfit != 0)
      {
       buyTp = Ask + (takeProfit *10* Point());
      }
-   if(trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,lot_size,Ask,buySL,buyTp,"Buy Trade Placed"))
+   double distance = (Ask - buySL)/Point();
+   if(trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,getlot(distance),Ask,buySL,buyTp,"Buy Trade Placed"))
      {
       Print("Buy Trade Placed: ",trade.ResultOrder());
      }
@@ -1773,7 +1797,54 @@ void placeBuyTrade()
      }
 
   }
+//+------------------------------------------------------------------+
+//|                                                                  |
+//+------------------------------------------------------------------+
+double getlot(double stop_loss)
+  {
+   Print("Tick Value: ",SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE));
+   Print("Tick Size: ",SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE));
+   double modeTickV=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE)
+                    ,modeTickS=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE);
+// Print("Pip value: ", NormalizeDouble(((SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE)/(SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE)/Point))*10),2));
+   double pipvalue = NormalizeDouble(((SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE)/(SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE)/Point()))*10),2);
+// pipvalue=NormalizeDouble((modeTickV/modeTickS/Point()),)
+// pipvalue=
+   pipvalue = pipvalue / 10;
+   double lotSize = lot_size;
+   if(lot_calculator==rsk) //calculating risk
+     {
+      double riskamount=(risk/100)*AccountInfoDouble(ACCOUNT_BALANCE);
+      double pipvalue_required=riskamount/stop_loss;
+      lotSize = pipvalue_required/pipvalue;
+      //sl=riskamount/pipValuelot
+      int roundDigit=0;
+      double step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
+
+      while(step<1)
+        {
+         roundDigit++;
+         step=step*10;
+        }
+      Print("Round Digits:",roundDigit);
+      lotSize = NormalizeDouble(lotSize,roundDigit);
+      //
+     }
+   Print("Lot Size: ",lotSize);
 
+   if(lotSize > SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX))
+     {
+      lotSize=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
+     }
+   else
+      if(lotSize<SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN))
+        {
+         lotSize=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
+        }
+
+//---
+   return lotSize;
+  }
 //+------------------------------------------------------------------+
 //|                                                                  |
 //+------------------------------------------------------------------+
@@ -1784,18 +1855,20 @@ void placeSellTrade()
    double sell_SL = 0,sell_Tp = 0, openPrice = 0, buySL = 0, buyTp = 0;
    openPrice = SymbolInfoDouble(Symbol(),SYMBOL_BID);
    double Bid = SymbolInfoDouble(Symbol(),SYMBOL_BID);
-
-   if(stoploss != 0)
-     {
-      sell_SL = Bid + (stoploss *10* Point());
-     }
+   int  ch = iBarShift(Symbol(), PERIOD_CURRENT,choch_index_time,false);  // get high of chock index
+   sell_SL = iHigh(Symbol(),PERIOD_CURRENT,ch) + stoploss *10 * Point();
+   double distance = (sell_SL - Bid)/Point();
+//if(stoploss != 0)
+//  {
+//   sell_SL = Bid + (stoploss *10* Point());
+//  }
    if(takeProfit != 0)
      {
       sell_Tp = Bid - (takeProfit *10* Point());
      }
 
 
-   if(trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,lot_size,Bid,sell_SL,sell_Tp,"Sell Trade Placed"))
+   if(trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,getlot(distance),Bid,sell_SL,sell_Tp,"Sell Trade Placed"))
      {
       Print("Sell Trade PLaced: ",trade.ResultOrder());
 
@@ -1822,27 +1895,27 @@ int OnInit()
 
    int idx = 0;
 
-//int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT,inpTime, false);
-//if(ObjectCreate(0,"line",OBJ_VLINE,0,inpTime,iLow(Symbol(),PERIOD_CURRENT,user_input_index)))
-//  {
-//   Print("vertical line created on chart : ");
-//  }
-//else
-//  {
-//   Print("error in creating line : ");
-//  }
-
-
-   int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT, D'2022.09.01 15:30:27', false);
-   if(ObjectCreate(0,"line",OBJ_VLINE,0,D'2022.09.01 15:30:27',iLow(Symbol(),PERIOD_CURRENT,user_input_index)))
+   int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT,inpTime, false);
+   if(ObjectCreate(0,"line",OBJ_VLINE,0,inpTime,iLow(Symbol(),PERIOD_CURRENT,user_input_index)))
      {
-      Print("object created on chart : ");
+      Print("vertical line created on chart : ");
      }
    else
      {
-      Print("object not created : ");
+      Print("error in creating line : ");
      }
 
+
+   //int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT, D'2022.09.01 15:30:27', false);
+   //if(ObjectCreate(0,"line",OBJ_VLINE,0,D'2022.09.01 15:30:27',iLow(Symbol(),PERIOD_CURRENT,user_input_index)))
+   //  {
+   //   Print("object created on chart : ");
+   //  }
+   //else
+   //  {
+   //   Print("object not created : ");
+   //  }
+
    object_find(object_name);
    if(object_find(object_name) == true)
      {
@@ -2022,7 +2095,7 @@ void OnTick()
             if(od_1[m].EntryCon == 1 && iTime(Symbol(),PERIOD_CURRENT,1) == od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "sell" && od_1[m].Time_of_candle_For_trade != 0 /*&& HIGH != 0 && LOW != 0*/)
               {
 
-               Print("i am in enrtry condition 1 : ");
+               //Print("i am in enrtry condition 1 : ");
 
                // Print("time is greater and signal is sell ",TimeCurrent());
 
@@ -2063,7 +2136,7 @@ void OnTick()
             if(od_1[m].EntryCon == 2 && TimeCurrent() > od_1[m].Time_of_candle_For_trade && od_1[m].Signal == "buy" && od_1[m].Time_of_candle_For_trade != 0 /*&& HIGH != 0 && LOW != 0*/)
               {
                // Print("time is greater and signal is buy ",TimeCurrent());
-               Print("i am in enrtry condition 1 : ");
+               // Print("i am in enrtry condition 1 : ");
 
                int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
                int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);