Browse Source

Ticket # 1483

Add stop loss , get lot and take profit
AhtashamShahzad3 2 years ago
parent
commit
e72926147f
2 changed files with 112 additions and 39 deletions
  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;
11 11
 
12 12
 #define orderNum 200
13 13
 
14
+
15
+enum lotcalculator
16
+  {
17
+   fix, //Fixed Lot Size
18
+   rsk, //Risk Percentage
19
+  };
20
+
21
+
14 22
 struct tradeOrder
15 23
   {
16 24
 
@@ -43,7 +51,7 @@ enum entryCondition
43 51
    two,      // Entry A2
44 52
   };
45 53
 
46
-input entryCondition Entry_condition_1 = one;   // Entry Condition
54
+// input entryCondition Entry_condition_1 = one;   // Entry Condition
47 55
 
48 56
 sinput      string                str                    = "<><><><><><> Set Object Name <><><><><><>";
49 57
 input       string                object_name            = "line";
@@ -54,9 +62,12 @@ input       datetime             inpTime                 = 0;//First Line Draw t
54 62
 
55 63
 sinput      string               str2                    = "<><><><><><> Default Settings <><><><><><>";
56 64
 input       double               lot_size                = 0.1;
57
-input       double               stoploss                = 20;
58
-input       double               takeProfit              = 20;
59
-input       int                  magic_no                = 123;
65
+input lotcalculator lot_calculator = fix; //Lot Size Calculator
66
+
67
+input double risk = 1; //Risk in Percentage %
68
+input       double               stoploss                = 20;   // Stoploss Pips buffer from choch candle
69
+input       double               takeProfit              = 20;   // TakeProfit in Pips
70
+input       int                  magic_no                = 123;   //  Magic no
60 71
 
61 72
 
62 73
 
@@ -602,7 +613,10 @@ void choch(int i)
602 613
             ObjectDelete(0,"target line");
603 614
            }
604 615
 
605
-         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));
616
+         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)));
617
+           {
618
+            Print("object error ",GetLastError());
619
+           }
606 620
          ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
607 621
          ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
608 622
 
@@ -622,7 +636,7 @@ void choch(int i)
622 636
          Print("from where you end ",chock_index1);
623 637
 
624 638
          bool condition_not_match = false;
625
-         for(int p=chock_index +1 ; p >=chock_index1; p--)
639
+         for(int p=chock_index - 1 ; p >=chock_index1; p--)
626 640
            {
627 641
             if(iLow(Symbol(),PERIOD_CURRENT,p) < HIGH)
628 642
               {
@@ -634,6 +648,7 @@ void choch(int i)
634 648
            {
635 649
             HIGH = 0.0;
636 650
             LOW = 0.0;
651
+            Print("TArget line deleted");
637 652
             condition_not_match = false;
638 653
 
639 654
             if(object_find("target line") > 0)
@@ -775,7 +790,10 @@ void choch(int i)
775 790
             ObjectDelete(0,"target line");
776 791
            }
777 792
 
778
-         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));
793
+         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)));
794
+           {
795
+            Print("object error ",GetLastError());
796
+           }
779 797
          ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
780 798
          ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
781 799
 
@@ -795,7 +813,7 @@ void choch(int i)
795 813
          Print("from where you end ",chock_index1);
796 814
 
797 815
          condition_not_match = false;
798
-         for(int p=chock_index +1 ; p >=chock_index1; p--)
816
+         for(int p=chock_index - 1 ; p >=chock_index1; p--)
799 817
            {
800 818
             if(iLow(Symbol(),PERIOD_CURRENT,p) < HIGH)
801 819
               {
@@ -805,6 +823,7 @@ void choch(int i)
805 823
 
806 824
          if(condition_not_match == true)
807 825
            {
826
+            Print("TArget line deleted");
808 827
             HIGH = 0.0;
809 828
             LOW = 0.0;
810 829
             condition_not_match = false;
@@ -988,7 +1007,7 @@ void choch(int i)
988 1007
          Print("from where you end ",chock_index1);
989 1008
 
990 1009
          bool condition_not_match = false;
991
-         for(int p=chock_index +1 ; p >=chock_index1; p--)
1010
+         for(int p=chock_index -  1 ; p >=chock_index1; p--)
992 1011
            {
993 1012
             if(iHigh(Symbol(),PERIOD_CURRENT,p) > LOW)
994 1013
               {
@@ -998,6 +1017,7 @@ void choch(int i)
998 1017
 
999 1018
          if(condition_not_match == true)
1000 1019
            {
1020
+            Print("line target deleted :");
1001 1021
             HIGH = 0.0;
1002 1022
             LOW = 0.0;
1003 1023
             condition_not_match = false;
@@ -1160,7 +1180,7 @@ void choch(int i)
1160 1180
          Print("from where you end ",chock_index1);
1161 1181
 
1162 1182
          condition_not_match = false;
1163
-         for(int p=chock_index +1 ; p >=chock_index1; p--)
1183
+         for(int p=chock_index - 1 ; p >=chock_index1; p--)
1164 1184
            {
1165 1185
             if(iHigh(Symbol(),PERIOD_CURRENT,p) > LOW)
1166 1186
               {
@@ -1172,6 +1192,7 @@ void choch(int i)
1172 1192
            {
1173 1193
             HIGH = 0.0;
1174 1194
             LOW = 0.0;
1195
+            Print("line target deleted :");
1175 1196
             condition_not_match = false;
1176 1197
 
1177 1198
             if(object_find("target line") > 0)
@@ -1754,16 +1775,19 @@ void placeBuyTrade()
1754 1775
    double sell_SL = 0,sell_Tp = 0, openPrice = 0,buySL = 0, buyTp = 0;
1755 1776
    openPrice = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
1756 1777
    double Ask = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
1757
-
1758
-   if(stoploss != 0)
1759
-     {
1760
-      buySL = Ask - (stoploss *10* Point());
1761
-     }
1778
+   int  ch = iBarShift(Symbol(), PERIOD_CURRENT,choch_index_time,false);  // get high of chock index
1779
+   buySL = iLow(Symbol(),PERIOD_CURRENT,ch) - stoploss *10 * Point();
1780
+//
1781
+//   if(stoploss != 0)
1782
+//     {
1783
+//      buySL = Ask - (stoploss *10* Point());
1784
+//     }
1762 1785
    if(takeProfit != 0)
1763 1786
      {
1764 1787
       buyTp = Ask + (takeProfit *10* Point());
1765 1788
      }
1766
-   if(trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,lot_size,Ask,buySL,buyTp,"Buy Trade Placed"))
1789
+   double distance = (Ask - buySL)/Point();
1790
+   if(trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,getlot(distance),Ask,buySL,buyTp,"Buy Trade Placed"))
1767 1791
      {
1768 1792
       Print("Buy Trade Placed: ",trade.ResultOrder());
1769 1793
      }
@@ -1773,7 +1797,54 @@ void placeBuyTrade()
1773 1797
      }
1774 1798
 
1775 1799
   }
1800
+//+------------------------------------------------------------------+
1801
+//|                                                                  |
1802
+//+------------------------------------------------------------------+
1803
+double getlot(double stop_loss)
1804
+  {
1805
+   Print("Tick Value: ",SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE));
1806
+   Print("Tick Size: ",SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE));
1807
+   double modeTickV=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE)
1808
+                    ,modeTickS=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE);
1809
+// Print("Pip value: ", NormalizeDouble(((SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE)/(SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE)/Point))*10),2));
1810
+   double pipvalue = NormalizeDouble(((SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE)/(SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE)/Point()))*10),2);
1811
+// pipvalue=NormalizeDouble((modeTickV/modeTickS/Point()),)
1812
+// pipvalue=
1813
+   pipvalue = pipvalue / 10;
1814
+   double lotSize = lot_size;
1815
+   if(lot_calculator==rsk) //calculating risk
1816
+     {
1817
+      double riskamount=(risk/100)*AccountInfoDouble(ACCOUNT_BALANCE);
1818
+      double pipvalue_required=riskamount/stop_loss;
1819
+      lotSize = pipvalue_required/pipvalue;
1820
+      //sl=riskamount/pipValuelot
1821
+      int roundDigit=0;
1822
+      double step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
1823
+
1824
+      while(step<1)
1825
+        {
1826
+         roundDigit++;
1827
+         step=step*10;
1828
+        }
1829
+      Print("Round Digits:",roundDigit);
1830
+      lotSize = NormalizeDouble(lotSize,roundDigit);
1831
+      //
1832
+     }
1833
+   Print("Lot Size: ",lotSize);
1776 1834
 
1835
+   if(lotSize > SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX))
1836
+     {
1837
+      lotSize=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
1838
+     }
1839
+   else
1840
+      if(lotSize<SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN))
1841
+        {
1842
+         lotSize=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
1843
+        }
1844
+
1845
+//---
1846
+   return lotSize;
1847
+  }
1777 1848
 //+------------------------------------------------------------------+
1778 1849
 //|                                                                  |
1779 1850
 //+------------------------------------------------------------------+
@@ -1784,18 +1855,20 @@ void placeSellTrade()
1784 1855
    double sell_SL = 0,sell_Tp = 0, openPrice = 0, buySL = 0, buyTp = 0;
1785 1856
    openPrice = SymbolInfoDouble(Symbol(),SYMBOL_BID);
1786 1857
    double Bid = SymbolInfoDouble(Symbol(),SYMBOL_BID);
1787
-
1788
-   if(stoploss != 0)
1789
-     {
1790
-      sell_SL = Bid + (stoploss *10* Point());
1791
-     }
1858
+   int  ch = iBarShift(Symbol(), PERIOD_CURRENT,choch_index_time,false);  // get high of chock index
1859
+   sell_SL = iHigh(Symbol(),PERIOD_CURRENT,ch) + stoploss *10 * Point();
1860
+   double distance = (sell_SL - Bid)/Point();
1861
+//if(stoploss != 0)
1862
+//  {
1863
+//   sell_SL = Bid + (stoploss *10* Point());
1864
+//  }
1792 1865
    if(takeProfit != 0)
1793 1866
      {
1794 1867
       sell_Tp = Bid - (takeProfit *10* Point());
1795 1868
      }
1796 1869
 
1797 1870
 
1798
-   if(trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,lot_size,Bid,sell_SL,sell_Tp,"Sell Trade Placed"))
1871
+   if(trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,getlot(distance),Bid,sell_SL,sell_Tp,"Sell Trade Placed"))
1799 1872
      {
1800 1873
       Print("Sell Trade PLaced: ",trade.ResultOrder());
1801 1874
 
@@ -1822,27 +1895,27 @@ int OnInit()
1822 1895
 
1823 1896
    int idx = 0;
1824 1897
 
1825
-//int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT,inpTime, false);
1826
-//if(ObjectCreate(0,"line",OBJ_VLINE,0,inpTime,iLow(Symbol(),PERIOD_CURRENT,user_input_index)))
1827
-//  {
1828
-//   Print("vertical line created on chart : ");
1829
-//  }
1830
-//else
1831
-//  {
1832
-//   Print("error in creating line : ");
1833
-//  }
1834
-
1835
-
1836
-   int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT, D'2022.09.01 15:30:27', false);
1837
-   if(ObjectCreate(0,"line",OBJ_VLINE,0,D'2022.09.01 15:30:27',iLow(Symbol(),PERIOD_CURRENT,user_input_index)))
1898
+   int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT,inpTime, false);
1899
+   if(ObjectCreate(0,"line",OBJ_VLINE,0,inpTime,iLow(Symbol(),PERIOD_CURRENT,user_input_index)))
1838 1900
      {
1839
-      Print("object created on chart : ");
1901
+      Print("vertical line created on chart : ");
1840 1902
      }
1841 1903
    else
1842 1904
      {
1843
-      Print("object not created : ");
1905
+      Print("error in creating line : ");
1844 1906
      }
1845 1907
 
1908
+
1909
+   //int user_input_index = iBarShift(Symbol(), PERIOD_CURRENT, D'2022.09.01 15:30:27', false);
1910
+   //if(ObjectCreate(0,"line",OBJ_VLINE,0,D'2022.09.01 15:30:27',iLow(Symbol(),PERIOD_CURRENT,user_input_index)))
1911
+   //  {
1912
+   //   Print("object created on chart : ");
1913
+   //  }
1914
+   //else
1915
+   //  {
1916
+   //   Print("object not created : ");
1917
+   //  }
1918
+
1846 1919
    object_find(object_name);
1847 1920
    if(object_find(object_name) == true)
1848 1921
      {
@@ -2022,7 +2095,7 @@ void OnTick()
2022 2095
             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*/)
2023 2096
               {
2024 2097
 
2025
-               Print("i am in enrtry condition 1 : ");
2098
+               //Print("i am in enrtry condition 1 : ");
2026 2099
 
2027 2100
                // Print("time is greater and signal is sell ",TimeCurrent());
2028 2101
 
@@ -2063,7 +2136,7 @@ void OnTick()
2063 2136
             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*/)
2064 2137
               {
2065 2138
                // Print("time is greater and signal is buy ",TimeCurrent());
2066
-               Print("i am in enrtry condition 1 : ");
2139
+               // Print("i am in enrtry condition 1 : ");
2067 2140
 
2068 2141
                int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
2069 2142
                int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);