Price Data Components
Orders Execution
Indicators Used
0
Views
0
Downloads
0
Favorites
Profitability Reports
AUD/USD
Oct 2024 - Jan 2025
0.00 %
Total Trades
0
Won Trades
0
Lost trades
0
Win Rate
0.0 %
Expected payoff
0.00
Gross Profit
0.00
Gross Loss
0.00
Total Net Profit
0.00
-100%
-50%
0%
50%
100%
GBP/USD
Oct 2024 - Jan 2025
0.00 %
Total Trades
0
Won Trades
0
Lost trades
0
Win Rate
0.0 %
Expected payoff
0.00
Gross Profit
0.00
Gross Loss
0.00
Total Net Profit
0.00
-100%
-50%
0%
50%
100%
StepMAExpert_v1.45
//+------------------------------------------------------------------+
//| StepMAExpert_v1.45.mq4 |
//| Copyright © 2006, TrendLaboratory Ltd. |
//| http://finance.groups.yahoo.com/group/TrendLaboratory |
//| E-mail: igorad2004@list.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, TrendLaboratory Ltd."
#property link "http://finance.groups.yahoo.com/group/TrendLaboratory"
#include <stdlib.mqh>
//#include <Tracert.mqh>
//---- input parameters
extern string Expert_Name = "---- StepMAExpert_v1.45 ----";
extern int Magic = 1007;
extern int Slippage = 6;
extern bool Trace = false; // Trace Switch
extern string Main_Parameters = " Trade Volume & Trade Method";
extern double Lots = 0.1;
extern int TrailingStopMode = 0; // Trailing Stop Mode Switch (0-without TS, 1-with TS)
extern double TrailingStop = 0; // Classic Trailing Stop Value
extern bool SwingTrade = false; // Swing or Reverse Trade Switch
extern bool PendingOrder = false; // PendingOrder/InstantExecution Switch
extern double PendOrdGap = 10; // Gap from High/Low for Pending Orders
extern int SessionStart = 0; // Start Hour of Trade Session
extern int SessionEnd = 24; // End Hour of Trade Session
extern int FilterPeriod = 50; // Period of filter (EMA)
extern string Long_Trade = " Input data for Long Positions";
extern double StepSizeLong = 0; // Step Size (in points)
extern bool HighLowLong = false; // High/Low Mode Switch (if true than more sensitive)
extern int MomPeriodLong = 1;
extern double DeltaLong = 0; // StepMA Momentum Level(in points)
extern double DeltaLongExit = 0; // StepMA Momentum Level for Exit (in points)
extern double StopSizeLong = 1.0; // Step Size for Trailing Stop (in points)
extern double ProfitSizeLong = 1.0; // Step Size for Trailing Profit (in points)
extern double InitialStopLong = 0; // Initial Stop Value (in points)
extern double TakeProfitLong = 0; // Take Profit Value (in points)
extern double BreakEvenLong = 0; // BreakEven Level (in points)
extern double BreakEvenGapLong = 0; // BreakEven Gap (in points)
extern string Short_Trade = " Input data for Short Positions ";
extern double StepSizeShort = 0; // Step Size (in points)
extern bool HighLowShort = false; // High/Low Mode Switch (if true than more sensitive)
extern int MomPeriodShort = 1;
extern double DeltaShort = 0; // StepMA Momentum Level (in points)
extern double DeltaShortExit = 0; // StepMA Momentum Level for Exit (in points)
extern double StopSizeShort = 1.0; // Step Size for Trailing Stop (in points)
extern double ProfitSizeShort = 1.0; // Step Size for Trailing Profit (in points)
extern double InitialStopShort = 0; // Initial Stop Value (in points)
extern double TakeProfitShort = 0; // Take Profit Value (in points)
extern double BreakEvenShort = 0; // BreakEven Level (in points)
extern double BreakEvenGapShort = 0; // BreakEven Gap (in points)
extern string MM_Parameters = " MoneyManagement by L.Williams ";
extern bool MM = false; // ÌÌ Switch
extern double Risk = 0.15; // Risk Factor
extern double LossMax = 1000; // Maximum Loss by 1 Lot
int Length=10;
double Kv=1.0;
int trend=0,TradeSignal=0,ExitSignal=0,prevtrendlong=0,matrendlong=0,
matrendshort=0,prevtrendshort=0,Kz=0,mode=0,Type=0, numords;
double Smin1=0,Smax1=0,Price=0,PriceStop=0, BuyProfit=0, SellProfit=0;
double line0long=0,line1long=0,bsmin1long=0,bsmax1long=0, StepLong=0,Smin1long=0,Smax1long=0,
line0short=0,line1short=0,bsmin1short=0,bsmax1short=0,StepShort=0,Smin1short=0,Smax1short=0,
point=0, spread=0;
double BuyStop=0,SellStop=0,ATRmin=10000,ATRmax=0,bsmax2=0,bsmin2=0;
int b=0,cnt=0, digit=0;
bool FirstTime = false;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
FirstTime = true;
//----
return(0);
}
// ---- Scan Trades
int ScanTrades()
{
int total = OrdersTotal();
int numords = 0;
for(int cnt=0; cnt<total; cnt++)
{
OrderSelect(cnt, SELECT_BY_POS);
if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == Magic)
numords++;
}
return(numords);
}
void TrailProfit()
{
int total=OrdersTotal();
for (cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS);
mode=OrderType();
if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic )
{
if ( mode==OP_BUY )
{
if (ProfitSizeLong > 0)
//BuyProfit = line0 + Kp*Step/Kv;
BuyProfit = bsmax1long;
else BuyProfit = OrderTakeProfit();
//Print("BuyProfit=",BuyProfit," lin0=",line0," Step=",Step," Kp,Kv=", Kp,",",Kv);
if( BuyProfit > OrderTakeProfit())
{
OrderModify(OrderTicket(),OrderOpenPrice(),
OrderStopLoss(),
NormalizeDouble(BuyProfit,digit),0,LightGreen);
return(0);
}
}
if ( mode==OP_SELL )
{
if (ProfitSizeShort > 0)
//SellProfit = line0 - Kp*Step/Kv;
SellProfit = bsmin1short;
else SellProfit = OrderTakeProfit();
//Print("SellProfit=",SellProfit," lin0=",line0," Step=",Step," Kp,Kv=", Kp,",",Kv);
if( SellProfit < OrderTakeProfit())
{
OrderModify(OrderTicket(),OrderOpenPrice(),
OrderStopLoss(),
NormalizeDouble(SellProfit, digit),0,Yellow);
return(0);
}
}
}
}
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
int total,ticket;
//----
//if ( Trace ) SetTrace();
if (Bars>b)
{
b=Bars;
digit = MarketInfo(Symbol(),MODE_DIGITS);
point = MarketInfo(Symbol(),MODE_POINT);
//spread = MarketInfo(Symbol(),MODE_SPREAD);
double Lotsi=Lots;
if ( MM ) Lotsi=NormalizeDouble(Lots*Lots*AccountFreeMargin()*Risk/LossMax,1);
if (Lotsi<0.1) Lotsi=0.1;
double line1longexit = line0long;
if (MomPeriodLong == 1 ) prevtrendlong = matrendlong;
else prevtrendlong = iCustom(NULL,0,"StepMA_v7EA",Length,Kv,StepSizeLong,0,0,0,HighLowLong,0,0,5,MomPeriodLong+1);
line1long= iCustom(NULL,0,"StepMA_v7EA",Length,Kv,StepSizeLong,0,0,0,HighLowLong,0,0,0,MomPeriodLong+1);
line0long = iCustom(NULL,0,"StepMA_v7EA",Length,Kv,StepSizeLong,0,0,0,HighLowLong,0,0,0,1);
matrendlong = iCustom(NULL,0,"StepMA_v7EA",Length,Kv,StepSizeLong,0,0,0,HighLowLong,0,0,5,1);
double line1shortexit = line0short;
if (MomPeriodShort == 1 ) prevtrendshort = matrendshort;
else prevtrendshort = iCustom(NULL,0,"StepMA_v7EA",Length,Kv,StepSizeShort,0,0,0,HighLowShort,0,0,5,MomPeriodShort+1);
line1short= iCustom(NULL,0,"StepMA_v7EA",Length,Kv,StepSizeShort,0,0,0,HighLowShort,0,0,0,MomPeriodShort+1);
line0short = iCustom(NULL,0,"StepMA_v7EA",Length,Kv,StepSizeShort,0,0,0,HighLowShort,0,0,0,1);
matrendshort = iCustom(NULL,0,"StepMA_v7EA",Length,Kv,StepSizeShort,0,0,0,HighLowShort,0,0,5,1);
if(StepSizeLong>0) StepLong=Kv*StepSizeLong*point;
if(StepSizeShort>0) StepShort=Kv*StepSizeShort*point;
bsmin1long = line0long - ProfitSizeLong*point;
bsmax1long = line0long + ProfitSizeLong*point;
double slinelong = line0long;
Smin1long= slinelong - StopSizeLong*point;
Smax1long= slinelong + StopSizeLong*point;
bsmin1short = line0short - ProfitSizeShort*point;
bsmax1short = line0short + ProfitSizeShort*point;
double slineshort = line0short;
Smin1short= slineshort - StopSizeShort*point;
Smax1short= slineshort + StopSizeShort*point;
//if ( i==1 ){ FirstTime = false;
//Print (" i=",i," line0=",line0," line1=",line1," matrend=", matrend, " Step=", Step); }
//else
//if ( i == NBars )
//Print ("Smin=",Smin1," Smax=",Smax1," matrend=", matrend, " Step=", Step);
//}
// -----------
bool TimeCondition = false;
TimeCondition = (TimeHour(CurTime()) >= SessionStart && TimeHour(CurTime()) <=SessionEnd);
// ------------
if ( FilterPeriod > 0 )
{
bool BuyFilter = false;
BuyFilter = ( Close[1]>iMA(NULL,0,FilterPeriod,0,MODE_EMA,0,1));
bool SellFilter = false;
SellFilter =( Close[1]<iMA(NULL,0,FilterPeriod,0,MODE_EMA,0,1));
}
else
{ BuyFilter = true; SellFilter = true; }
// ------------
// Trade Signal area
if(!SwingTrade) TradeSignal=0;
// - BUY
if
(
BuyFilter
&&
line0long-line1long>DeltaLong*point
&&
line1long>0
&&
prevtrendlong < 0
//|| prevtrend2 < 0)
) TradeSignal= 1;
// - SELL
if
(
SellFilter
&&
line1short-line0short>DeltaShort*point
&&
line1short>0
&&
prevtrendshort > 0
//|| prevtrend2 > 0)
) TradeSignal= -1;
//Print (" line0=",line0," line1=",line1," matrend=", matrend, " signal=", TradeSignal);
// Exit Signal area
// - BUY Orders
if
(
//Close[1]<iMA(NULL,0,50,0,MODE_EMA,0,1)
//||
line1longexit-line0long>DeltaLongExit*point
//line1long-line0long>0
) ExitSignal= -1;
// - SELL Orders
if
(
//Close[1]>iMA(NULL,0,50,0,MODE_EMA,0,1)
//||
line0short-line1shortexit>DeltaShortExit*point
//line0short-line1short>0
) ExitSignal= 1;
//if(SwingTrade) ExitSignal=TradeSignal;
TrailProfit();
//-----------------------------
total=OrdersTotal();
for (cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
mode=OrderType();
if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
// Orders Close area :
// - BUY Orders
if ( ExitSignal<0 )
{
if (mode==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Yellow);
}
}
// - SELL Orders
if ( ExitSignal>0 )
{
if (mode==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
}
}
//if (BreakEvenShort > 0 || BreakEvenLong > 0)
//{
if (mode==OP_BUY && BreakEvenLong > 0)
{
BuyStop = OrderStopLoss();
if (Bid-OrderOpenPrice() > Kz*BreakEvenLong*point)
{
BuyStop=OrderOpenPrice()+((Kz-1)*BreakEvenLong+BreakEvenGapLong)*point;
OrderModify(OrderTicket(),OrderOpenPrice(),
NormalizeDouble(BuyStop, digit),
OrderTakeProfit(),0,LightBlue);
Kz=Kz+1;
return(0);
}
}
if (mode==OP_SELL && BreakEvenShort > 0)
{
SellStop = OrderStopLoss();
if (OrderOpenPrice()-Ask > Kz*BreakEvenShort*point)
{
SellStop=OrderOpenPrice()-((Kz-1)*BreakEvenShort+BreakEvenGapShort)*point;
OrderModify(OrderTicket(),OrderOpenPrice(),
NormalizeDouble(SellStop, digit),
OrderTakeProfit(),0,Orange);
Kz=Kz+1;
return(0);
}
}
//}
// Orders Modify Area
if (TrailingStopMode > 0)
{
if (mode==OP_BUY)
{
if (TrailingStop > 0)
BuyStop = Bid - TrailingStop*point;
else
if ( StopSizeLong > 0)
//BuyStop = line0 - Ks*Step/Kv - spread;
BuyStop = Smin1long;
else BuyStop = OrderStopLoss();
if ( BuyStop > OrderStopLoss() || OrderStopLoss()==0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),
NormalizeDouble(BuyStop, digit),
OrderTakeProfit(),0,LightGreen);
return(0);
}
}
// - SELL Orders
if (mode==OP_SELL)
{
if (TrailingStop > 0)
BuyStop = Ask + TrailingStop*point;
else
if ( StopSizeShort > 0)
//SellStop = line0 + Ks*Step/Kv + spread;
SellStop = Smax1short;
else SellStop = OrderStopLoss();
if( SellStop < OrderStopLoss() || OrderStopLoss()==0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),
NormalizeDouble(SellStop, digit),
OrderTakeProfit(),0,Yellow);
return(0);
}
}
}
}
// Closing of Pending Orders
if(Close[1]<MathMin(iMA(NULL,0,FilterPeriod,0,MODE_EMA,0,1),line0long))int PendClose=1;
if(Close[1]>MathMax(iMA(NULL,0,FilterPeriod,0,MODE_EMA,0,1),line0short)) PendClose=-1;
if (mode==OP_BUYSTOP && PendClose>0 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
OrderDelete(OrderTicket());
return(0);
}
if (mode==OP_SELLSTOP && PendClose<0 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
OrderDelete(OrderTicket());
return(0);
}
}//for (cnt=0;cnt<total;cnt++)
// Orders open area :
// - SELL Orders
if (ScanTrades()<1)
{
if ( trend>=0 && TradeSignal<0 && TimeCondition)
{
if(PendingOrder)
{
Type=OP_SELLSTOP;
Price=Low[1]-PendOrdGap*point;
PriceStop=Price;
}
else
{
Type=OP_SELL;
Price=Bid;
PriceStop=Ask;
}
if (InitialStopShort > 0)
SellStop = PriceStop + InitialStopShort*point;
else
if( StopSizeShort > 0)
//SellStop= line0 + Ks*Step/Kv + spread;
SellStop= Smax1short;
else SellStop=0;
if (TakeProfitShort > 0)
SellProfit = Price - TakeProfitShort*point;
else
if (ProfitSizeShort > 0)
//SellProfit = line0 - Kp*Step/Kv;
SellProfit = bsmin1short;
else SellProfit=0;
ticket=OrderSend(Symbol(),Type,Lotsi,
NormalizeDouble(Price, digit),
Slippage,
NormalizeDouble(SellStop, digit),
NormalizeDouble(SellProfit, digit),
"sell",Magic,0,Red);
Kz=1;
if(SwingTrade) trend=-1; else {trend=0;}
if(ticket<0)
{
Print("OrderSend failed with error #",GetLastError());
return(0);
}
return(0);
}
// - BUY Orders
if (trend <=0 && TradeSignal>0 && TimeCondition)
{
if(PendingOrder)
{
Type=OP_BUYSTOP;
Price=High[1]+PendOrdGap*point;
PriceStop = Price;
}
else
{
Type=OP_BUY;
Price=Ask;
PriceStop = Bid;
}
if (InitialStopLong > 0)
BuyStop = PriceStop - InitialStopLong*point;
else
if ( StopSizeLong > 0)
//BuyStop = line0-Ks*Step/Kv-spread;
BuyStop = Smin1long;
else BuyStop=0;
if (TakeProfitLong > 0)
BuyProfit = Price + TakeProfitLong*point;
else
if (ProfitSizeLong > 0)
//BuyProfit = line0 + Kp*Step/Kv;
BuyProfit = bsmax1long;
else BuyProfit=0;
ticket=OrderSend(Symbol(),Type,Lotsi,
NormalizeDouble(Price, digit),
Slippage,
NormalizeDouble(BuyStop, digit),
NormalizeDouble(BuyProfit, digit),
"buy",Magic,0,Blue);
Kz=1;
if(SwingTrade) trend=1; else {trend=0;}
if(ticket<0)
{
Print("OrderSend failed with error #",GetLastError());
return(0);
}
return(0);
}
}
}//if (Bars>b)
//----
//----
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
---