Price Data Components
Orders Execution
Indicators Used
0
Views
0
Downloads
0
Favorites
StuficStoch
//+------------------------------------------------------------------+
//| Stufic.mq4 |
//| Tomas Hruby |
//| http://tomashruby.com |
//+------------------------------------------------------------------+
#property copyright "Tomas Hruby"
#property link "http://tomashruby.com"
/*
Lots - Lots is fixed, without money management, it must be manualy adjusted to 10K USD
SL, TP it means 2000 for 5 digits, 200 for 4 digits brokers
UseTrailingSL - Only when SL pip size value is set
ProfitUSD - Close all positions if AccountProfit() reach ProfitUSD value percent, if you adjust Lots size you must adjust also Profit and LossUSD size with the same ratio
LossUSD - Close all positions if AccountProfit() reach LossUSD value (remember the realtion between LossUSD, ProfitUSD and Lots size!!!)
LossUSDTrade = Close immediately trades with this loss (USD)
CounterTrend = Its means that our signal can give us opposite information. Just use it on some markets
OpenBarEnter = process only at each bar open
HighLowBars = number of bars where we search for iHighest and iLowest
SameOrderAfterPips = Open another order after X pips (10pips = value 100 at 5 digits borker)
OppositeLotsMultiplier = Multiply sum of opened lots for opening in the opposite direction (if signal indicating trend change)
DirectMultiplier = aggressive Lots multipling of new opposite orders
ReverseClosePositions = close all opposite orders if there is opposite signal
LotMaxLimit = Max lot value for each new order
TimeStart = start hour 0 - 12
TimeEnd = end hour 12 - 24
SignalMode = 1: MA crossing slow MA (in uptrend), 2: MA crossing slow MA, 3: MA crossing slow MA with price, 4: MA crossing slow MA with price and Williams Perc Range was in the zone, 5: MA crossing slow MA with price and Williams Perc Range is crossing out from overbought or oversold zone
EAPeriod = Period for indicators MA and iHighest and iLowest, 0 = M1, 1 = M5, etc... see the init() section
FastMAMode, SlowMAMode: 0 = sma, 1 = ema, 2 = smma, 3 = lwma
yMAShift = MA shift for previous MA values
*/
extern string StrategyName = "Stufic Pro";
extern string VER_trader = "1.1";
extern double Lots = 0.2;
extern double TP = 0;
extern double SL = 0;
extern bool UseTrailingSL = false;
extern double ProfitUSD = 0;
extern double LossUSD = 0;
extern bool ProfitUSDCloseOne = false;
extern bool LossUSDCloseOne = false;
extern double LossUSDTrade = 0;
extern bool CounterTrend = false;
extern bool OpenBarEnter = false;
extern string Orders_Manipulation = "--------------------------------";
extern bool ReverseClosePositions = false;
extern bool DirectMultiplier = true;
extern int SameOrderAfterPips = 600;
extern double OppositeLotsMultiplier = 0.8;
extern double AnotherOrderLotsMultiplier = 0.0;
extern double LotMaxLimit = 3;
extern int OrdersMaxLimitDir = 1000;
//Magic number for identification of Expert Advisor
extern int MagicNumber = 1982;
extern string Time_Filter = "--------------------------------";
extern int TimeStart = 5;
extern int TimeEnd = 20;
extern string Signal_Values = "--------------------------------";
extern int SignalMode = 2;
extern int HighLowBars = 4;
extern int TrendBars = 10;
extern int EAPeriod = 2;
extern string Stochastic_filter = "--------------------------------";
extern int STOPeriod = 14;
extern bool StochOpposite = false;
extern int STOShift = 2;
extern string Williams_Percentage_Range_filter = "--------------------------------";
extern int WPRPeriod = 14;
extern int WPRShift = 14;
extern bool WilliamsOpposite= false;
extern string Moving_Average_settings = "--------------------------------";
extern int MAmode = 1;
extern int FastMAPeriod = 2;
extern int MidMAPeriod = 2;
extern int SlowMAPeriod = 30;
extern int yMAShift = 2;
//action
int A_DONOTHING = -1,
A_OPENBUY = 0,
A_OPENSELL = 1,
CLOSE_WORST = 1,
CLOSE_BEST = 2;
int LastOrderType = -1,
Timeframe, TimeframeP,
CandleTimeframe;
double LastOrderOpenPriceBuy = 0,
LastOrderOpenPriceSell = 0,
StopLoss,
TargetProfit,
StartBalance = 0,
ActualTradeLossLimit = 0;
bool MoneyManagement = false,
TimeIsOk;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
if(EAPeriod==0){ Timeframe = PERIOD_M1; TimeframeP = PERIOD_M15;
}else if(EAPeriod == 1){ Timeframe = PERIOD_M5; TimeframeP = PERIOD_M30;
}else if(EAPeriod == 2){ Timeframe = PERIOD_M15; TimeframeP = PERIOD_H1;
}else if(EAPeriod == 3){ Timeframe = PERIOD_M30; TimeframeP = PERIOD_H4;
}else if(EAPeriod == 4){ Timeframe = PERIOD_H1; TimeframeP = PERIOD_D1;
}else if(EAPeriod == 5){ Timeframe = PERIOD_H4; TimeframeP = PERIOD_D1;
}else if(EAPeriod == 6){ Timeframe = PERIOD_D1; TimeframeP = PERIOD_D1;
}else{ Timeframe = PERIOD_W1; TimeframeP = PERIOD_D1;
}
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
bool OpenBar=true;
if(OpenBarEnter) if(iVolume(Symbol(),0,0)>1) OpenBar=false;
if(OpenBar){
bool upcandle = false,
downcandle = false,
downtrend = false,
uptrend = false;
int ticket,
action = A_DONOTHING;
double Lot = 0,
Profit = 0,
STO = 0,
SLPriceNearCandle = 0;
StopLoss = 0;
TargetProfit = 0;
RefreshRates();
if(IsOptimization()){ //there are no trades of other EA's so we can get profit from global variable
Profit = AccountProfit();
}else{ //in real trading we need to know only profit of orders by Stufic
Profit = StuficProfit();
}
//Check profit or loss and then close all if there are reasons:
if(ProfitUSD>0 && Profit >= ProfitUSD){
if(ProfitUSDCloseOne){
CloseOne(CLOSE_BEST);
}else{
CloseAll();
}
}
if(LossUSD>0 && Profit <= LossUSD*-1){
if(LossUSDCloseOne){
CloseOne(CLOSE_WORST);
}else{
CloseAll();
}
}
if(LossUSDTrade>0) ActualTradeLossLimit = LossUSDTrade*-1;
if(MoneyManagement){
Lot = LotsResize(0,Lots);
}else{
Lot = LotsResize(Lots,0);
}
if(TimeStart>=Hour() && Hour()<TimeEnd){
TimeIsOk = true;
}else{
TimeIsOk = false;
}
if(TimeIsOk){
//market data for signal
if(SignalMode > 2){
int iH1 = iHighest(Symbol(),Timeframe,MODE_HIGH,HighLowBars,0);
int iL1 = iLowest(Symbol(),Timeframe,MODE_LOW,HighLowBars,0);
double pH1 = iHigh(Symbol(),Timeframe,iH1);
double pL1 = iLow(Symbol(),Timeframe,iL1);
}
if(SignalMode > 3 && SignalMode < 6){
double WPR = iWPR(Symbol(), TimeframeP, WPRPeriod,0);
double yWPR = iWPR(Symbol(),TimeframeP, WPRPeriod,WPRShift); //y means yesterday or previous or something like before
}
double FastMAprice = iMA(Symbol(), Timeframe, FastMAPeriod, 0, MAmode, PRICE_CLOSE, 0);
double yFastMAprice = iMA(Symbol(), Timeframe, FastMAPeriod, 0, MAmode, PRICE_CLOSE, yMAShift);
// double MidMAprice = iMA(Symbol(), Timeframe, MidMAPeriod, 0, MAmode, PRICE_CLOSE, 0);
// double yMidMAprice = iMA(Symbol(), Timeframe, MidMAPeriod, 0, MAmode, PRICE_CLOSE, yMAShift);
double SlowMAprice = iMA(Symbol(), Timeframe, SlowMAPeriod, 0, MAmode, PRICE_CLOSE, 0);
double ySlowMAprice = iMA(Symbol(), Timeframe, SlowMAPeriod, 0, MAmode, PRICE_CLOSE, yMAShift);
if(SignalMode == 0){
//Slow MA is in uptrend and Fast MA crossing up
if(ySlowMAprice<SlowMAprice && yFastMAprice < ySlowMAprice && FastMAprice>SlowMAprice){ uptrend=true;}
//opposite
if(ySlowMAprice>SlowMAprice && yFastMAprice > ySlowMAprice && FastMAprice<SlowMAprice){ downtrend=true;}
}else if(SignalMode == 1){
//Slow MA is in downtrend and Fast MA crossing up
if(ySlowMAprice>SlowMAprice && yFastMAprice < ySlowMAprice && FastMAprice>SlowMAprice){ uptrend=true;}
//opposite
if(ySlowMAprice>SlowMAprice && yFastMAprice > ySlowMAprice && FastMAprice<SlowMAprice){ downtrend=true;}
}else if(SignalMode == 2){
//Fast MA simply crossing up thru Slow MA
if(yFastMAprice < ySlowMAprice && FastMAprice>SlowMAprice){ uptrend=true;}
//opposite
if(yFastMAprice > ySlowMAprice && FastMAprice<SlowMAprice){ downtrend=true;}
}else if(SignalMode == 3){
//Fast MA crossing up thru Slow MA && price is over Fast Slow MA && previous price was below Fast Slow MA (range is crossing up thru MA)
if(yFastMAprice < ySlowMAprice && FastMAprice>SlowMAprice
&& Ask>SlowMAprice && Ask>FastMAprice
&& pL1<SlowMAprice && pL1<FastMAprice
){ uptrend=true; }
//opposite
if(yFastMAprice > ySlowMAprice && FastMAprice<SlowMAprice
&& Bid<SlowMAprice && Bid<FastMAprice
&& pH1>SlowMAprice && pH1>FastMAprice
){ downtrend=true; }
}else if(SignalMode == 4){
//Fast MA crossing up thru Slow MA && price is over Fast Slow MA && previous price was below Fast Slow MA (range is crossing up thru MA) && Williams was oversold
if(yFastMAprice < ySlowMAprice && FastMAprice>SlowMAprice
&& Ask>SlowMAprice && Ask>FastMAprice
&& pL1<SlowMAprice && pL1<FastMAprice
){
if(yWPR < -70){
if(WilliamsOpposite){ downtrend=true; }else{ uptrend=true; }
}
}
//opposite
if(yFastMAprice > ySlowMAprice && FastMAprice<SlowMAprice
&& Bid<SlowMAprice && Bid<FastMAprice
&& pH1>SlowMAprice && pH1>FastMAprice
){
if(yWPR > -30){
if(WilliamsOpposite){ uptrend=true; }else{ downtrend=true; }
}
}
}else if(SignalMode == 5){
//Fast MA crossing up thru Slow MA && price is over Fast Slow MA && previous price was below Fast Slow MA (range is crossing up thru MA) && Williams escaping from oversold zone
if(yFastMAprice < ySlowMAprice && FastMAprice>SlowMAprice
&& Ask>SlowMAprice && Ask>FastMAprice
&& pL1<SlowMAprice && pL1<FastMAprice
){
if(yWPR < -80 && WPR > -80){
if(WilliamsOpposite){ downtrend=true; }else{ uptrend=true; }
}
}
//opposite
if(yFastMAprice > ySlowMAprice && FastMAprice<SlowMAprice
&& Bid<SlowMAprice && Bid<FastMAprice
&& pH1>SlowMAprice && pH1>FastMAprice
){
if(yWPR > -20 && WPR < -20){
if(WilliamsOpposite){ uptrend=true; }else{ downtrend=true; }
}
}
}else if(SignalMode == 6){
//Fast MA crossing up thru Slow MA && price is over Fast Slow MA && previous price was below Fast Slow MA (range is crossing up thru MA) && Stochastic is at oversold zone
if(yFastMAprice < ySlowMAprice && FastMAprice > SlowMAprice
&& Ask>SlowMAprice && Ask>FastMAprice
&& pL1<SlowMAprice && pL1<FastMAprice
){
STO = iStochastic(Symbol(),Timeframe,STOPeriod,3,5,MODE_SMA,0,MODE_MAIN,STOShift);
if(STO < 20){ //is oversold
if(StochOpposite){ downtrend=true; }else{ uptrend=true; }
}
}
//opposite
if(yFastMAprice > ySlowMAprice && FastMAprice < SlowMAprice
&& Bid<SlowMAprice && Bid<FastMAprice
&& pH1>SlowMAprice && pH1>FastMAprice
){
STO = iStochastic(Symbol(),Timeframe,STOPeriod,3,5,MODE_SMA,0,MODE_MAIN,STOShift);
if(STO > 80){ //is overbought
if(StochOpposite){ uptrend=true; }else{ downtrend=true; }
}
}
}
int new_signal = -1;
//create signal from data
if(CounterTrend){
if(uptrend){
new_signal=OP_SELL;
}else if(downtrend){
new_signal=OP_BUY;
}
}else{
if(uptrend){
new_signal=OP_BUY;
}else if(downtrend){
new_signal=OP_SELL;
}
}
}//eof TimeIsOk
//set the action: check and update SL
double BuyLots = 0, SelLots = 0;
int BuyOrders = 0, SelOrders = 0; //For OrdersMaxLimitDir
RefreshRates();
if(OrdersTotal()>0){
for(int r=0;r<OrdersTotal();r++){ //check actual opened orders for actions
if(OrderSelect(r,SELECT_BY_POS,MODE_TRADES)==true){
if(MagicNumber==OrderMagicNumber()){ //is it order of this EA?
if(UseTrailingSL && SL>0) UpdateSL(); //Trailing Stop Loss
if(LossUSDTrade>0 && OrderProfit()+OrderSwap() < ActualTradeLossLimit){
if(OrderType()==OP_BUY){
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3)) Print("Closing error BUY! Ticket: ",OrderTicket(),", Er: ",GetLastError());
}else if(OrderType()==OP_SELL){
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3)) Print("Closing error SELL! Ticket: ",OrderTicket(),", Er: ",GetLastError());
}
}else{
//Sum of lots for each direction
if(OrderType()==OP_BUY){ BuyLots+=OrderLots(); BuyOrders++;}
if(OrderType()==OP_SELL){ SelLots+=OrderLots(); SelOrders++; }
}
}
}
}
}
if(TimeIsOk){
if(new_signal != -1){
if(new_signal==OP_BUY && OrdersMaxLimitDir > BuyOrders){
if(AnotherOrderDistance(OP_BUY)){
action=A_OPENBUY;
if(SelLots>=BuyLots && SelLots>0){
if(ReverseClosePositions) CloseAll(OP_SELL);
if(DirectMultiplier){
Lot=NormalizeDouble(SelLots*OppositeLotsMultiplier,2);
}else{
Lot=NormalizeDouble(SelLots+(Lot*OppositeLotsMultiplier),2);
}
}else{
if(BuyLots>0){
Lot=NormalizeDouble(BuyLots+(Lot*AnotherOrderLotsMultiplier),2);
}else{
//Lot = Lot; //normal lots open
}
}
}else{
action=A_DONOTHING;
}
}else if(new_signal==OP_SELL && OrdersMaxLimitDir > SelOrders){
if(AnotherOrderDistance(OP_SELL)){
action=A_OPENSELL;
if(BuyLots>=SelLots && BuyLots>0){
if(ReverseClosePositions) CloseAll(OP_BUY);
if(DirectMultiplier){
Lot=NormalizeDouble(BuyLots*OppositeLotsMultiplier,2);
}else{
Lot=NormalizeDouble(BuyLots+(Lot*OppositeLotsMultiplier),2);
}
}else{
if(SelLots>0){
Lot=NormalizeDouble(SelLots+(Lot*AnotherOrderLotsMultiplier),2);
}else{
//Lot = Lot; //normal lots open
}
}
}else{
action=A_DONOTHING;
}
}//eof OP_BUY OP_SELL
}//eof action
//We dont need to open bigger positions than we want
if(Lot>LotMaxLimit){
Lot=LotMaxLimit;
}
if(action==A_OPENBUY && Lot>=0.01){
//SL and TP must be set such from 100.00 (10pips) to 10000.00 (1000 pips)
if(SL>0) StopLoss = Ask-(SL*Point);
if(TP>0) TargetProfit = Ask+(TP*Point);
ticket = OrderSend(Symbol(),OP_BUY,Lot,Ask,3,NormalizeDouble(StopLoss,Digits),NormalizeDouble(TargetProfit,Digits),"S1; "+DBS((Ask-Bid)/Point,0),MagicNumber,0,CLR_NONE);
if(ticket>0){ Print("Order BUY opened"); }
}else if(action==A_OPENSELL && Lot>=0.01){
if(SL>0) StopLoss = Bid+(SL*Point);
if(TP>0) TargetProfit = Bid-(TP*Point);
ticket = OrderSend(Symbol(),OP_SELL,Lot,Bid,3,NormalizeDouble(StopLoss,Digits),NormalizeDouble(TargetProfit,Digits),"S1; "+DBS((Ask-Bid)/Point,0),MagicNumber,0,CLR_NONE);
if(ticket>0){ Print("Order SELL opened"); }
}//eof Action
}//eof TimeIsOk
return(0);
}
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
string DBS(double Num,int Nen){
return (DoubleToStr(Num,Nen));
}
double LotsResize(double fLots,double fLots10K){
double rLots=0; //returned lots
//if 10K is set we adapt the lots size to account size
if(fLots10K>0){
rLots=fLots10K*(AccountInfoDouble(ACCOUNT_BALANCE)/10000);
}else{
rLots=fLots;
}
//We must check minimal step
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.10){
rLots = MathRound( rLots/MarketInfo(Symbol(),MODE_LOTSTEP) ) * MarketInfo(Symbol(),MODE_LOTSTEP);
rLots = NormalizeDouble(rLots,1);
}
//we check minimal and maximal values
if(rLots<MarketInfo(Symbol(),MODE_MINLOT)){
rLots=MarketInfo(Symbol(),MODE_MINLOT);
}else if(rLots>MarketInfo(Symbol(),MODE_MAXLOT)){
rLots=MarketInfo(Symbol(),MODE_MAXLOT);
}
return(NormalizeDouble(rLots,2));
}
//check if we can open another order after predefined distance defined in pips in variable AnotherOrderPips
bool AnotherOrderDistance(int fType){
bool DistanceOk=true;
if(OrdersTotal()>0){
for(int r=0;r<OrdersTotal();r++){
if(OrderSelect(r,SELECT_BY_POS,MODE_TRADES)==true){
//is it order of this EA?
if(MagicNumber==OrderMagicNumber()){
if(OrderType()==OP_BUY && fType==OP_BUY){
if(MathAbs(OrderOpenPrice()-Ask)<(SameOrderAfterPips*Point)){ DistanceOk=false; return(DistanceOk); }
}else if(OrderType()==OP_SELL && fType==OP_SELL){
if(MathAbs(OrderOpenPrice()-Bid)<(SameOrderAfterPips*Point)){ DistanceOk=false; return(DistanceOk); }
}
}
}
}
}
return(DistanceOk);
}
void CloseAll(int fType = -1){
bool res;
int i;
int Total=OrdersTotal();
if(Total>0){
for(i=Total-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==TRUE){
if(MagicNumber==OrderMagicNumber()){
if(OrderType()==OP_BUY){
if(fType==OP_BUY || fType==-1){ res=OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);}
}
if(OrderType()==OP_SELL){
if(fType==OP_SELL || fType==-1){ res=OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);}
}
if(res!=true){
Print("Close All, GetLastError: ",GetLastError());
}
}
}
}
}
}
void CloseOne(int fKind = -1){
bool res;
int i;
int Total=OrdersTotal();
int Ticket = 0;
double Profit = 0;
if(Total>0){
for(i=Total-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==TRUE){
if(MagicNumber==OrderMagicNumber()){
if(fKind == CLOSE_WORST){
if(OrderProfit() < Profit && OrderProfit() < 0){
Profit = OrderProfit();
Ticket = OrderTicket();
}
}else if(fKind == CLOSE_BEST){
if(OrderProfit() > Profit && OrderProfit() > 0){
Profit = OrderProfit();
Ticket = OrderTicket();
}
}//eof kind of order
}///eof magic
}
}
}
if(Ticket>0){
if(OrderSelect(Ticket,SELECT_BY_TICKET)==TRUE){
if(OrderType()==OP_BUY){
res=OrderClose(Ticket,OrderLots(),Bid,3,CLR_NONE);
}
if(OrderType()==OP_SELL){
res=OrderClose(Ticket,OrderLots(),Ask,3,CLR_NONE);
}
if(res!=true){
Print("Close One "+fKind+", GetLastError: ",GetLastError());
}
}
}
}
//Get account profit mady only by orders of stufic
double StuficProfit(){
double profit = 0;
RefreshRates();
int Total=OrdersTotal();
if(Total>0){
for(int i=Total-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==TRUE){
if(MagicNumber==OrderMagicNumber()){
profit +=OrderSwap()+OrderProfit();
}
}
}
}
return(profit);
}
//Trailing SL
bool UpdateSL(){
RefreshRates();
double fAsk = MarketInfo(Symbol(),MODE_ASK);
double fBid = MarketInfo(Symbol(),MODE_BID);
double fPoint = MarketInfo(Symbol(),MODE_POINT);
double fDigits = MarketInfo(Symbol(),MODE_DIGITS);
double fSL;
if(MagicNumber==OrderMagicNumber()){
if(SL>0){
if(OrderType()==OP_BUY){
fSL = fAsk-(SL*fPoint);
if(OrderStopLoss()<fSL && OrderStopLoss()!=0){
if(OrderModify(OrderTicket(),NormalizeDouble(OrderOpenPrice(),fDigits),NormalizeDouble(fSL,fDigits),NormalizeDouble(OrderTakeProfit(),fDigits),0,Yellow)){
return(true);
}else{
return(false);
}
}
}else if(OrderType()==OP_SELL){
fSL = fBid+(SL*fPoint);
if(OrderStopLoss()>fSL && OrderStopLoss()!=0){
if(OrderModify(OrderTicket(),NormalizeDouble(OrderOpenPrice(),fDigits),NormalizeDouble(fSL,fDigits),NormalizeDouble(OrderTakeProfit(),fDigits),0,Yellow)){
return(true);
}else{
return(false);
}
}
}
}
}
return(false);
}
int Trend(){
bool downtrend, uptrend;
//get market data for signal
int iH0=iHighest(Symbol(),Timeframe,MODE_HIGH,TrendBars*3,0);
int iH1=iHighest(Symbol(),Timeframe,MODE_HIGH,TrendBars,(TrendBars*2));
int iH2=iHighest(Symbol(),Timeframe,MODE_HIGH,TrendBars,TrendBars);
int iH3=iHighest(Symbol(),Timeframe,MODE_HIGH,TrendBars,0);
double pH0 = iHigh(Symbol(),Timeframe,iH0);
double pH1 = iHigh(Symbol(),Timeframe,iH1);
double pH2 = iHigh(Symbol(),Timeframe,iH2);
double pH3 = iHigh(Symbol(),Timeframe,iH3);
int iL0=iLowest(Symbol(),Timeframe,MODE_LOW,TrendBars*3,0);
int iL1=iLowest(Symbol(),Timeframe,MODE_LOW,TrendBars,(TrendBars*2));
int iL2=iLowest(Symbol(),Timeframe,MODE_LOW,TrendBars,TrendBars);
int iL3=iLowest(Symbol(),Timeframe,MODE_LOW,TrendBars,0);
double pL0 = iLow(Symbol(),Timeframe,iL0);
double pL1 = iLow(Symbol(),Timeframe,iL1);
double pL2 = iLow(Symbol(),Timeframe,iL2);
double pL3 = iLow(Symbol(),Timeframe,iL3);
//downtrend
if(pH1>pH2 && pH2>pH3 && Bid<pL0){ //downtrend and this is new low
downtrend=true;
}
//uptrend
if(pL1<pL2 && pL2<pL3 && Ask>pH0){ //uptrend and this is new high
uptrend=true;
}
if(uptrend==true && downtrend==false){
return(1);
}else if(downtrend==true && uptrend==false){
return(2);
}else{
return(0);
}
}
//+------------------------------------------------------------------+
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---