Orders Execution
Miscellaneous
0
Views
0
Downloads
0
Favorites
rich
//+------------------------------------------------------------------+
//| Rich.mq4 |
//| © 2008, Christopher |
//| http://www.expert-profit.webs.com/ |
//+------------------------------------------------------------------+
//
// This EA uses MapPath file ("rl.txt" by default) from your
// /tester/files/ (for strategy tester) or /experts/files/ (for actual use)
// to get the initial statistics. It also continues to gather its own
// statistics and appends it to the initial file, saving it after
// deinitilizing.
//
#property copyright "© 2010, Christopher"
#property link "http://www.expert-profit.webs.com/"
#define BUY_MAP 1
#define SELL_MAP 0
#define HOLD_MAP 2
//Map size for BUY and SELL
#define MAPBASE 10000
//Map size for HOLD
#define HOLDBASE 25000
//Number of map memory-cells for each bar
#define VBASE 7
int LastBars = 0;
double vector[VBASE]; //Vector with memory-cells for current bar
double vectorp[VBASE]; //Vector with memory-cells for previous bar
//3 Maps
double MapBuy[MAPBASE][VBASE];
double MapSell[MAPBASE][VBASE];
double MapHold[HOLDBASE][VBASE];
//Min and Max amounts of pips of profit to consider teaching BUY and SELL maps
extern int MinPips = 5;
extern int MaxPips = 43;
extern int TakeProfit = 150;
extern int StopLoss = 100;
extern double Lots = 1;
extern double Slippage = 3;
extern string MapPath = "rl.txt";
extern string EAName = "RowLearner";
int Magic;
double TLots;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
Magic = Period()+1937004;
InitKohonenMap();
LoadKohonenMap();
TLots = Lots;
return(0);
}
//+------------------------------------------------------------------+
//| main expert function |
//+------------------------------------------------------------------+
int start()
{
if (Bars < 7) return(0);
//Wait for the new Bar in a chart.
if (LastBars == Bars) return(0);
else LastBars = Bars;
CloseAllOrders();
double bmu[3] = {0, 0, 0};
//Calculating the Tom Demark's pivot points over last 5 bars
double hi[5] = {0,0,0,0,0};
double lo[5] = {0,0,0,0,0};
hi[0] = High[2];
hi[1] = High[3];
hi[2] = High[4];
hi[3] = High[5];
hi[4] = High[6];
lo[0] = Low[2];
lo[1] = Low[3];
lo[2] = Low[4];
lo[3] = Low[5];
lo[4] = Low[6];
double H = hi[ArrayMaximum(hi)];
double L = lo[ArrayMinimum(lo)];
vectorp[0] = (H + L + Close[2]) / 3;
//The difference between pivots and Open price is used to normalize statistics
vectorp[1] = (2 * vectorp[0] - L) - Open[1];
vectorp[2] = (vectorp[0] + H - L) - Open[1];
vectorp[3] = (H + 2 * (vectorp[0] - L)) - Open[1];
vectorp[4] = (2 * vectorp[0] - H) - Open[1];
vectorp[5] = (vectorp[0] - H + L) - Open[1];
vectorp[6] = (L - 2 * (H - vectorp[0])) - Open[1];
vectorp[0] = vectorp[0] - Open[1];
hi[0] = High[1];
hi[1] = High[2];
hi[2] = High[3];
hi[3] = High[4];
hi[4] = High[5];
lo[0] = Low[1];
lo[1] = Low[2];
lo[2] = Low[3];
lo[3] = Low[4];
lo[4] = Low[5];
H = hi[ArrayMaximum(hi)];
L = lo[ArrayMinimum(lo)];
vector[0] = (H + L + Close[1]) / 3;
vector[1] = (2 * vector[0] - L) - Open[0];
vector[2] = (vector[0] + H - L) - Open[0];
vector[3] = (H + 2 * (vector[0] - L)) - Open[0];
vector[4] = (2 * vector[0] - H) - Open[0];
vector[5] = (vector[0] - H + L) - Open[0];
vector[6] = (L - 2 * (H - vector[0])) - Open[0];
vector[0] = vector[0] - Open[0];
MapLookup(vector, bmu);
TLots = (MathFloor(AccountBalance()/50))/10;
if ((bmu[0] < bmu[1]) && (bmu[0] < bmu[2])) Buy();
else if ((bmu[1] < bmu[0]) && (bmu[1] < bmu[2])) Sell();
Print("BMU Buy: ", bmu[0], " BMU Sell: ", bmu[1], " BMU Hold: ", bmu[2]);
if ((NormalizeDouble((Open[0] - Open[1]), Digits) >= NormalizeDouble((MinPips*Point), Digits)) && (NormalizeDouble((Open[0] - Open[1]), Digits) <= NormalizeDouble((MaxPips*Point), Digits))) TeachMap(BUY_MAP, vectorp);
else if ((NormalizeDouble((Open[0] - Open[1]), Digits) <= -NormalizeDouble((MinPips*Point), Digits)) && (NormalizeDouble((Open[0] - Open[1]), Digits) >= -NormalizeDouble((MaxPips*Point), Digits))) TeachMap(SELL_MAP, vectorp);
else TeachMap(HOLD_MAP, vectorp);
return(0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
SaveKohonenMap();
}
//+------------------------------------------------------------------+
//| Close all open orders |
//+------------------------------------------------------------------+
void CloseAllOrders()
{
int total = OrdersTotal();
for(int pos = 0;pos < total; pos++)
{
if(OrderSelect(pos, SELECT_BY_POS) == true)
{
if (OrderMagicNumber() == Magic)
{
if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
{
if (OrderSymbol() == Symbol()) //Check for symbol
{
int err = 0;
int count = 0;
while ((err != 1) && (count < 10))
{
if (OrdersTotal() == 0) return(0);
count++;
RefreshRates();
if (OrderType() == OP_SELL) err = OrderClose(OrderTicket(),OrderLots(),Ask,10,Violet); //Close position
else if (OrderType() == OP_BUY) err = OrderClose(OrderTicket(),OrderLots(),Bid,10,Violet); //Close position
}
}
}
}
}
}
}
void Buy()
{
int result = -1;
int count = 0;
while ((result == -1) && (count < 10))
{
RefreshRates();
count++;
double SL = 0;
double TP = 0;
if (StopLoss == 0) SL = 0;
else SL = Ask-StopLoss*Point;
if (TakeProfit == 0) TP = 0;
else TP = Ask+TakeProfit*Point;
if (IsTradeAllowed()) result = OrderSend(Symbol(),OP_BUY,TLots,Ask,Slippage,SL,TP,EAName,Magic,0);
if (result == -1)
{
int e = GetLastError();
Print(e);
}
}
}
void Sell()
{
int result = -1;
int count = 0;
while ((result == -1) && (count < 10))
{
RefreshRates();
count++;
double SL = 0;
double TP = 0;
if (StopLoss == 0) SL = 0;
else SL = Bid+StopLoss*Point;
if (TakeProfit == 0) TP = 0;
else TP = Bid-TakeProfit*Point;
if (IsTradeAllowed()) result = OrderSend(Symbol(),OP_SELL,TLots,Bid,Slippage,SL,TP,EAName,Magic,0);
if (result == -1)
{
int e = GetLastError();
Print(e);
}
}
}
void InitKohonenMap()
{
for (int i = 0; i < MAPBASE; i++)
{
for (int v = 0; i < VBASE; i++)
{
MapSell[i][v] = 0;
MapBuy[i][v] = 0;
}
}
for (i = 0; i < HOLDBASE; i++)
{
for (v = 0; i < VBASE; i++)
{
MapHold[i][v] = 0;
}
}
}
void MapLookup(double vector[], double& BMU[])
{
BMU[0] = FindBMU(BUY_MAP, vector);
BMU[1] = FindBMU(SELL_MAP, vector);
BMU[2] = FindBMU(HOLD_MAP, vector);
int i = 0;
//BUY
for (i = 0; i < MAPBASE; i++)
{
int z = 0;
double vec[VBASE];
for (int v = 0; v < VBASE; v++)
{
if (MapBuy[i][v] == 0) z++;
vec[v] = MapBuy[i][v];
}
if (z == VBASE) break;
double E = EuclidDistance(vec, vector);
}
//SELL
for (i = 0; i < MAPBASE; i++)
{
z = 0;
for (v = 0; v < VBASE; v++)
{
if (MapSell[i][v] == 0) z++;
vec[v] = MapSell[i][v];
}
if (z == VBASE) break;
E = EuclidDistance(vec, vector);
}
//HOLD
for (i = 0; i < HOLDBASE; i++)
{
z = 0;
for (v = 0; v < VBASE; v++)
{
if (MapHold[i][v] == 0) z++;
vec[v] = MapHold[i][v];
}
if (z == VBASE) break;
E = EuclidDistance(vec, vector);
}
}
double FindBMU(int Buy, double vector[])
{
int N = 0;
if (Buy == 1) N = MAPBASE;
else if (Buy == 0) N = MAPBASE;
else N = HOLDBASE;
double BestEuclidDistance = 9999999;
double vec[VBASE];
for (int i = 0; i < N; i++)
{
double E;
for (int v = 0; v < VBASE; v++)
{
if (Buy == 1) vec[v] = MapBuy[i][v];
else if (Buy == 0) vec[v] = MapSell[i][v];
else vec[v] = MapHold[i][v];
}
E = EuclidDistance(vec, vector);
if (E < BestEuclidDistance)
{
BestEuclidDistance = E;
}
}
return(BestEuclidDistance);
}
double EuclidDistance(double VectorFromMap[], double vector[])
{
double E = 0;
for (int v = 0; v < VBASE; v++)
{
E += MathPow((VectorFromMap[v]*10000 - vector[v]*10000), 2);
}
E = MathSqrt(E);
return(E);
}
void TeachMap(int Buy, double vector[])
{
int BMUx = -1;
int N;
int x;
if (Buy == 1) N = MAPBASE;
else if (Buy == 0) N = MAPBASE;
else N = HOLDBASE;
for (x = 0; x < N; x++)
{
bool flag = false;
for (int v = 0; v < VBASE; v++)
{
if (Buy == 1) {if (MapBuy[x][v] != 0) flag = true;}
else if (Buy == 0) {if (MapSell[x][v] != 0) flag = true;}
else {if (MapHold[x][v] != 0) flag = true;}
}
if (flag == false) break;
}
for (v = 0; v < VBASE; v++)
{
if (Buy == 1) MapBuy[x][v] = vector[v];
else if (Buy == 0) MapSell[x][v] = vector[v];
else MapHold[x][v] = vector[v];
}
}
void LoadKohonenMap()
{
int handle = FileOpen(MapPath, FILE_BIN|FILE_WRITE|FILE_READ);
if (handle < 1)
{
Print("File couldn't be opened; the last error is ", GetLastError());
return(0);
}
FileReadArray(handle, MapBuy, 0, MAPBASE*VBASE);
FileReadArray(handle, MapSell, 0, MAPBASE*VBASE);
FileReadArray(handle, MapHold, 0, HOLDBASE*VBASE);
FileClose(handle);
}
void SaveKohonenMap()
{
int handle = FileOpen(MapPath, FILE_BIN|FILE_WRITE|FILE_READ);
if (handle < 1)
{
Print("File couldn't be opened; the last error is ", GetLastError());
return(0);
}
FileWriteArray(handle, MapBuy, 0, MAPBASE*VBASE);
FileWriteArray(handle, MapSell, 0, MAPBASE*VBASE);
FileWriteArray(handle, MapHold, 0, HOLDBASE*VBASE);
}
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
---