SOM EA

//+------------------------------------------------------------------+

//|                                                      SOM_v02.mq4 |

//|                      Copyright © 2010, MetaQuotes Software Corp. |

//|                                        http://www.metaquotes.net |

//+------------------------------------------------------------------+

#property copyright "Copyright © 2010, MetaQuotes Software Corp."

#property link      "http://www.metaquotes.net"

#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];

extern string MapPath = "rl.txt";

//+------------------------------------------------------------------+

//| expert initialization function                                   |

//+------------------------------------------------------------------+

int init()

  {

//----

   InitKohonenMap();

   LoadKohonenMap();   

//----

   return(0);

  }

//+------------------------------------------------------------------+

//| expert deinitialization function                                 |

//+------------------------------------------------------------------+

int deinit()

  {

//----

   SaveKohonenMap();

//----

   return(0);

  }

//+------------------------------------------------------------------+

//| expert start function                                            |

//+------------------------------------------------------------------+

int start()

  {

//----

   double bmu[3] = {0, 0, 0};

   vector[0] = 0;

   vector[1] = 1;

   vector[2] = 2;

   vector[3] = 3;

   vector[4] = 4;

   vector[5] = 5;

   vector[6] = 6;

   MapLookup(vector, bmu);   

  //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]);

   vectorp[0] = 0;

   vectorp[1] = 1;

   vectorp[2] = 2;

   vectorp[3] = 3;

   vectorp[4] = 4;

   vectorp[5] = 5;

   vectorp[6] = 6;

  //if () 

  TeachMap(BUY_MAP, vectorp);

  //else if ()  

  TeachMap(SELL_MAP, vectorp);

  //else 

  TeachMap(HOLD_MAP, vectorp);

   

//----

   return(0);

  }

//+------------------------------------------------------------------+

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 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);

}  

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];

}

}