|
@@ -11,6 +11,14 @@ CTrade trade;
|
|
|
|
|
|
|
|
#define orderNum 200
|
|
#define orderNum 200
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+enum lotcalculator
|
|
|
|
|
+ {
|
|
|
|
|
+ fix, //Fixed Lot Size
|
|
|
|
|
+ rsk, //Risk Percentage
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
struct tradeOrder
|
|
struct tradeOrder
|
|
|
{
|
|
{
|
|
|
|
|
|
|
@@ -43,7 +51,7 @@ enum entryCondition
|
|
|
two, // Entry A2
|
|
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 <><><><><><>";
|
|
sinput string str = "<><><><><><> Set Object Name <><><><><><>";
|
|
|
input string object_name = "line";
|
|
input string object_name = "line";
|
|
@@ -54,9 +62,12 @@ input datetime inpTime = 0;//First Line Draw t
|
|
|
|
|
|
|
|
sinput string str2 = "<><><><><><> Default Settings <><><><><><>";
|
|
sinput string str2 = "<><><><><><> Default Settings <><><><><><>";
|
|
|
input double lot_size = 0.1;
|
|
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");
|
|
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_RAY_RIGHT,true);
|
|
|
ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
|
|
ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
|
|
|
|
|
|
|
@@ -622,7 +636,7 @@ void choch(int i)
|
|
|
Print("from where you end ",chock_index1);
|
|
Print("from where you end ",chock_index1);
|
|
|
|
|
|
|
|
bool condition_not_match = false;
|
|
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)
|
|
if(iLow(Symbol(),PERIOD_CURRENT,p) < HIGH)
|
|
|
{
|
|
{
|
|
@@ -634,6 +648,7 @@ void choch(int i)
|
|
|
{
|
|
{
|
|
|
HIGH = 0.0;
|
|
HIGH = 0.0;
|
|
|
LOW = 0.0;
|
|
LOW = 0.0;
|
|
|
|
|
+ Print("TArget line deleted");
|
|
|
condition_not_match = false;
|
|
condition_not_match = false;
|
|
|
|
|
|
|
|
if(object_find("target line") > 0)
|
|
if(object_find("target line") > 0)
|
|
@@ -775,7 +790,10 @@ void choch(int i)
|
|
|
ObjectDelete(0,"target line");
|
|
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_RAY_RIGHT,true);
|
|
|
ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
|
|
ObjectSetInteger(0,"target line",OBJPROP_COLOR,clrGreen);
|
|
|
|
|
|
|
@@ -795,7 +813,7 @@ void choch(int i)
|
|
|
Print("from where you end ",chock_index1);
|
|
Print("from where you end ",chock_index1);
|
|
|
|
|
|
|
|
condition_not_match = false;
|
|
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)
|
|
if(iLow(Symbol(),PERIOD_CURRENT,p) < HIGH)
|
|
|
{
|
|
{
|
|
@@ -805,6 +823,7 @@ void choch(int i)
|
|
|
|
|
|
|
|
if(condition_not_match == true)
|
|
if(condition_not_match == true)
|
|
|
{
|
|
{
|
|
|
|
|
+ Print("TArget line deleted");
|
|
|
HIGH = 0.0;
|
|
HIGH = 0.0;
|
|
|
LOW = 0.0;
|
|
LOW = 0.0;
|
|
|
condition_not_match = false;
|
|
condition_not_match = false;
|
|
@@ -988,7 +1007,7 @@ void choch(int i)
|
|
|
Print("from where you end ",chock_index1);
|
|
Print("from where you end ",chock_index1);
|
|
|
|
|
|
|
|
bool condition_not_match = false;
|
|
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)
|
|
if(iHigh(Symbol(),PERIOD_CURRENT,p) > LOW)
|
|
|
{
|
|
{
|
|
@@ -998,6 +1017,7 @@ void choch(int i)
|
|
|
|
|
|
|
|
if(condition_not_match == true)
|
|
if(condition_not_match == true)
|
|
|
{
|
|
{
|
|
|
|
|
+ Print("line target deleted :");
|
|
|
HIGH = 0.0;
|
|
HIGH = 0.0;
|
|
|
LOW = 0.0;
|
|
LOW = 0.0;
|
|
|
condition_not_match = false;
|
|
condition_not_match = false;
|
|
@@ -1160,7 +1180,7 @@ void choch(int i)
|
|
|
Print("from where you end ",chock_index1);
|
|
Print("from where you end ",chock_index1);
|
|
|
|
|
|
|
|
condition_not_match = false;
|
|
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)
|
|
if(iHigh(Symbol(),PERIOD_CURRENT,p) > LOW)
|
|
|
{
|
|
{
|
|
@@ -1172,6 +1192,7 @@ void choch(int i)
|
|
|
{
|
|
{
|
|
|
HIGH = 0.0;
|
|
HIGH = 0.0;
|
|
|
LOW = 0.0;
|
|
LOW = 0.0;
|
|
|
|
|
+ Print("line target deleted :");
|
|
|
condition_not_match = false;
|
|
condition_not_match = false;
|
|
|
|
|
|
|
|
if(object_find("target line") > 0)
|
|
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;
|
|
double sell_SL = 0,sell_Tp = 0, openPrice = 0,buySL = 0, buyTp = 0;
|
|
|
openPrice = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
|
|
openPrice = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
|
|
|
double Ask = 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)
|
|
if(takeProfit != 0)
|
|
|
{
|
|
{
|
|
|
buyTp = Ask + (takeProfit *10* Point());
|
|
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());
|
|
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;
|
|
double sell_SL = 0,sell_Tp = 0, openPrice = 0, buySL = 0, buyTp = 0;
|
|
|
openPrice = SymbolInfoDouble(Symbol(),SYMBOL_BID);
|
|
openPrice = SymbolInfoDouble(Symbol(),SYMBOL_BID);
|
|
|
double Bid = 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)
|
|
if(takeProfit != 0)
|
|
|
{
|
|
{
|
|
|
sell_Tp = Bid - (takeProfit *10* Point());
|
|
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());
|
|
Print("Sell Trade PLaced: ",trade.ResultOrder());
|
|
|
|
|
|
|
@@ -1822,27 +1895,27 @@ int OnInit()
|
|
|
|
|
|
|
|
int idx = 0;
|
|
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
|
|
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);
|
|
object_find(object_name);
|
|
|
if(object_find(object_name) == true)
|
|
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*/)
|
|
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());
|
|
// 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*/)
|
|
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("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 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);
|
|
int close_index = iBarShift(Symbol(), PERIOD_CURRENT,od_1[m].choch_index_date_time,false);
|