Переглянути джерело

Ticket # 1483

Add stop loss , get lot and take profit
AhtashamShahzad3 2 роки тому
батько
коміт
e72926147f
2 змінених файлів з 112 додано та 39 видалено
  1. BIN
      BOS_CHOCH.ex5
  2. 112 39
      BOS_CHOCH.mq5

+ 112 - 39
BOS_CHOCH.mq5

@@ -11,6 +11,14 @@ CTrade  trade;
11
 
11
 
12
 #define orderNum 200
12
 #define orderNum 200
13
 
13
 
14
+
15
+enum lotcalculator
16
+  {
17
+   fix, //Fixed Lot Size
18
+   rsk, //Risk Percentage
19
+  };
20
+
21
+
14
 struct tradeOrder
22
 struct tradeOrder
15
   {
23
   {
16
 
24
 
@@ -43,7 +51,7 @@ enum entryCondition
43
    two,      // Entry A2
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
 sinput      string                str                    = "<><><><><><> Set Object Name <><><><><><>";
56
 sinput      string                str                    = "<><><><><><> Set Object Name <><><><><><>";
49
 input       string                object_name            = "line";
57
 input       string                object_name            = "line";
@@ -54,9 +62,12 @@ input       datetime             inpTime                 = 0;//First Line Draw t
54
 
62
 
55
 sinput      string               str2                    = "<><><><><><> Default Settings <><><><><><>";
63
 sinput      string               str2                    = "<><><><><><> Default Settings <><><><><><>";
56
 input       double               lot_size                = 0.1;
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
             ObjectDelete(0,"target line");
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
          ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
620
          ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
607
          ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
621
          ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
608
 
622
 
@@ -622,7 +636,7 @@ void choch(int i)
622
          Print("from where you end ",chock_index1);
636
          Print("from where you end ",chock_index1);
623
 
637
 
624
          bool condition_not_match = false;
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
             if(iLow(Symbol(),PERIOD_CURRENT,p) < HIGH)
641
             if(iLow(Symbol(),PERIOD_CURRENT,p) < HIGH)
628
               {
642
               {
@@ -634,6 +648,7 @@ void choch(int i)
634
            {
648
            {
635
             HIGH = 0.0;
649
             HIGH = 0.0;
636
             LOW = 0.0;
650
             LOW = 0.0;
651
+            Print("TArget line deleted");
637
             condition_not_match = false;
652
             condition_not_match = false;
638
 
653
 
639
             if(object_find("target line") > 0)
654
             if(object_find("target line") > 0)
@@ -775,7 +790,10 @@ void choch(int i)
775
             ObjectDelete(0,"target line");
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
          ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
797
          ObjectSetInteger(0,"target line",OBJPROP_RAY_RIGHT,true);
780
          ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
798
          ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
781
 
799
 
@@ -795,7 +813,7 @@ void choch(int i)
795
          Print("from where you end ",chock_index1);
813
          Print("from where you end ",chock_index1);
796
 
814
 
797
          condition_not_match = false;
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
             if(iLow(Symbol(),PERIOD_CURRENT,p) < HIGH)
818
             if(iLow(Symbol(),PERIOD_CURRENT,p) < HIGH)
801
               {
819
               {
@@ -805,6 +823,7 @@ void choch(int i)
805
 
823
 
806
          if(condition_not_match == true)
824
          if(condition_not_match == true)
807
            {
825
            {
826
+            Print("TArget line deleted");
808
             HIGH = 0.0;
827
             HIGH = 0.0;
809
             LOW = 0.0;
828
             LOW = 0.0;
810
             condition_not_match = false;
829
             condition_not_match = false;
@@ -988,7 +1007,7 @@ void choch(int i)
988
          Print("from where you end ",chock_index1);
1007
          Print("from where you end ",chock_index1);
989
 
1008
 
990
          bool condition_not_match = false;
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
             if(iHigh(Symbol(),PERIOD_CURRENT,p) > LOW)
1012
             if(iHigh(Symbol(),PERIOD_CURRENT,p) > LOW)
994
               {
1013
               {
@@ -998,6 +1017,7 @@ void choch(int i)
998
 
1017
 
999
          if(condition_not_match == true)
1018
          if(condition_not_match == true)
1000
            {
1019
            {
1020
+            Print("line target deleted :");
1001
             HIGH = 0.0;
1021
             HIGH = 0.0;
1002
             LOW = 0.0;
1022
             LOW = 0.0;
1003
             condition_not_match = false;
1023
             condition_not_match = false;
@@ -1160,7 +1180,7 @@ void choch(int i)
1160
          Print("from where you end ",chock_index1);
1180
          Print("from where you end ",chock_index1);
1161
 
1181
 
1162
          condition_not_match = false;
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
             if(iHigh(Symbol(),PERIOD_CURRENT,p) > LOW)
1185
             if(iHigh(Symbol(),PERIOD_CURRENT,p) > LOW)
1166
               {
1186
               {
@@ -1172,6 +1192,7 @@ void choch(int i)
1172
            {
1192
            {
1173
             HIGH = 0.0;
1193
             HIGH = 0.0;
1174
             LOW = 0.0;
1194
             LOW = 0.0;
1195
+            Print("line target deleted :");
1175
             condition_not_match = false;
1196
             condition_not_match = false;
1176
 
1197
 
1177
             if(object_find("target line") > 0)
1198
             if(object_find("target line") > 0)
@@ -1754,16 +1775,19 @@ void placeBuyTrade()
1754
    double sell_SL = 0,sell_Tp = 0, openPrice = 0,buySL = 0, buyTp = 0;
1775
    double sell_SL = 0,sell_Tp = 0, openPrice = 0,buySL = 0, buyTp = 0;
1755
    openPrice = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
1776
    openPrice = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
1756
    double Ask = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
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
    if(takeProfit != 0)
1785
    if(takeProfit != 0)
1763
      {
1786
      {
1764
       buyTp = Ask + (takeProfit *10* Point());
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
       Print("Buy Trade Placed: ",trade.ResultOrder());
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
    double sell_SL = 0,sell_Tp = 0, openPrice = 0, buySL = 0, buyTp = 0;
1855
    double sell_SL = 0,sell_Tp = 0, openPrice = 0, buySL = 0, buyTp = 0;
1785
    openPrice = SymbolInfoDouble(Symbol(),SYMBOL_BID);
1856
    openPrice = SymbolInfoDouble(Symbol(),SYMBOL_BID);
1786
    double Bid = SymbolInfoDouble(Symbol(),SYMBOL_BID);
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
    if(takeProfit != 0)
1865
    if(takeProfit != 0)
1793
      {
1866
      {
1794
       sell_Tp = Bid - (takeProfit *10* Point());
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
       Print("Sell Trade PLaced: ",trade.ResultOrder());
1873
       Print("Sell Trade PLaced: ",trade.ResultOrder());
1801
 
1874
 
@@ -1822,27 +1895,27 @@ int OnInit()
1822
 
1895
 
1823
    int idx = 0;
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
    else
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
    object_find(object_name);
1919
    object_find(object_name);
1847
    if(object_find(object_name) == true)
1920
    if(object_find(object_name) == true)
1848
      {
1921
      {
@@ -2022,7 +2095,7 @@ void OnTick()
2022
             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*/)
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
                // Print("time is greater and signal is sell ",TimeCurrent());
2100
                // Print("time is greater and signal is sell ",TimeCurrent());
2028
 
2101
 
@@ -2063,7 +2136,7 @@ void OnTick()
2063
             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*/)
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
                // Print("time is greater and signal is buy ",TimeCurrent());
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
                int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
2141
                int reversal_indexx = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].reversal_index_date_time,false);
2069
                int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);
2142
                int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);