#property copyright "Igor S" #property link "igor@fxproadvisor.com" #property show_inputs extern string StartTime = "2008.11.01 01:00"; extern string EndTime = "2008.12.01 20:00"; extern int MaxIterations = 50; extern int spread = 0; extern int LotsPercent = 1; bool gi_104 = TRUE; bool gi_108 = TRUE; bool gi_unused_112 = FALSE; extern bool test = FALSE; extern double InitialDeposit = 10000.0; extern bool IncreasingLot = FALSE; bool gi_unused_132 = FALSE; extern int test_number = 75; extern int test_dir = 24237; double gd_144 = 0.95; double gd_152 = 1.0; double gd_160 = 2.0; double gd_168 = 2.0; int gi_176; int gi_180; int gia_184[200]; int g_count_188; int gi_192; string gs_dummy_196; int gia_204[3]; int gi_212; int gi_unused_216; int g_shift_224; int g_shift_228; double gda_232[5][3]; double gda_236[5][5][3]; double gda_240[5][3]; double gda_244[]; double gda_248[]; double gda_252[][5]; double gd_256; double gda_264[][4]; int gi_268 = -1; int gia_272[1000]; int gia_276[1000][2]; int gia_280[]; double gda_284[53][3]; double gda_288[53][3]; double gda_292[]; double gda_296[]; double gd_300; double gd_308; double gd_316; double gd_324; bool gi_332; bool gi_336; int g_index_340; int gi_344; int gi_348; int gi_unused_352; double gd_356; double gd_unused_364; double gd_372; double gd_380; double gd_388; double gd_396; double gda_404[100000][7]; double gd_408; int Check() { int li_0 = gia_204[0] * gia_204[0] + gia_204[0] + gia_204[0] * gia_204[1] + gia_204[1] + gia_204[1] * gia_204[2] + gia_204[2] + 1; if (li_0 != 53) { Print("Net params doesnt match, needed amount : ", li_0); return (0); } if (iBars(Symbol(), Period()) - 1 < gi_180) { Print("Not enough bars"); return (0); } if (gia_204[1] > gia_204[0]) { Print("Incorrect Network setup, please correct weights and biases"); return (0); } if (InitialDeposit < 10000.0 || 1.0 * InitialDeposit / (1.0 * LotsPercent) < 1000.0) { Print("Not enough money! Change Initial Deposit or LotsPercent"); return (0); } return (1); } int init() { Print("Initializing..."); Comment("Initializing..."); g_shift_224 = iBarShift(Symbol(), Period(), StrToTime(StartTime)); g_shift_228 = iBarShift(Symbol(), Period(), StrToTime(EndTime)); if (g_shift_228 > g_shift_224) { Print("INCORRECT PERIOD!"); Comment("INCORRECT PERIOD!"); Sleep(3000); return (0); } gi_180 = g_shift_224 - g_shift_228; Print("MaxBars = ", gi_180); Print("Testing time from " + TimeToStr(iTime(Symbol(), Period(), g_shift_224), TIME_DATE) + " " + TimeToStr(iTime(Symbol(), Period(), g_shift_224), TIME_MINUTES) + " till " + TimeToStr(iTime(Symbol(), Period(), g_shift_228), TIME_DATE) + " " + TimeToStr(iTime(Symbol(), Period(), g_shift_228), TIME_MINUTES)); gd_256 = 0.1; gi_348 = 52; gia_204[0] = 5; gia_204[1] = 3; gia_204[2] = 1; if (!Check()) return (0); MathSrand(TimeLocal()); gi_212 = MathRand(); if (test || !gi_104) gi_212 = test_dir; gi_344 = MarketInfo(Symbol(), MODE_SPREAD); if (gi_344 < spread) gi_344 = spread; ArrayResize(gda_252, gi_180); ArrayResize(gia_280, gi_180); ArrayResize(gda_264, gi_180); ArrayResize(gda_248, gi_180); ArrayResize(gda_244, 10); for (int l_count_0 = 0; l_count_0 < 5; l_count_0++) Norm(l_count_0); for (int l_count_4 = 0; l_count_4 < 5; l_count_4++) { for (int li_8 = g_shift_228; li_8 < g_shift_224; li_8++) { gda_252[li_8 - g_shift_228][l_count_4] = 2 / (gda_244[l_count_4 * 2 + 1] - gda_244[l_count_4 * 2]) * Input(l_count_4, li_8) + (1 - 2 / (gda_244[l_count_4 * 2 + 1] - gda_244[l_count_4 * 2]) * (gda_244[l_count_4 * 2 + 1])); } } for (li_8 = g_shift_228; li_8 < g_shift_224; li_8++) { gia_280[li_8 - g_shift_228] = iTime(Symbol(), 0, li_8); gda_264[li_8 - g_shift_228][0] = iClose(Symbol(), 0, li_8) + gi_344 * Point; gda_264[li_8 - g_shift_228][1] = iClose(Symbol(), 0, li_8); gda_264[li_8 - g_shift_228][2] = iHigh(Symbol(), 0, li_8); gda_264[li_8 - g_shift_228][3] = iLow(Symbol(), 0, li_8); } ArrayResize(gda_292, gi_180); ArrayResize(gda_296, gi_180); Volatility_Buffering(); if (test) TS("robot_log.csv", "Bar;Date;Time;Signal;Ticket;Type;Open Price;TakeProfit;StopLoss;Bid;Ask;High;Low;Lots;Close Price;Floating Profit;PF;Fixed Profit"); Comment("Initialized."); Print("Initialized."); return (0); } int deinit() { if (!test) DeleteFit(); Comment(""); return (0); } void Norm(int ai_0) { for (int l_index_20 = 0; l_index_20 < ArraySize(gda_248); l_index_20++) gda_248[l_index_20] = Input(ai_0, l_index_20); gda_244[2 * ai_0] = gda_248[ArrayMinimum(gda_248)]; gda_244[ai_0 * 2 + 1] = gda_248[ArrayMaximum(gda_248)]; } void Volatility_Buffering() { double ld_0; double ld_8; for (int li_16 = g_shift_228; li_16 < g_shift_224; li_16++) { ld_0 = 0; for (int li_20 = 1; li_20 <= 30; li_20++) { ld_8 = iHigh(Symbol(), Period(), li_16 + li_20) - iLow(Symbol(), Period(), li_16 + li_20); ld_0 += ld_8; } gda_296[li_16 - g_shift_228] = 1.5 * (ld_0 / 30.0 / Point); gda_292[li_16 - g_shift_228] = 3.0 * (ld_0 / 30.0 / Point); } } int OptInit() { gd_256 = 0.1; gd_408 = 0.0; gd_388 = 0.0; gi_332 = FALSE; gi_336 = FALSE; gd_356 = 0.0; gd_unused_364 = 0.0; gd_372 = 0.0; gd_380 = 0.0; gd_396 = 0.0; g_index_340 = 0; ArrayInitialize(gda_404, 0); return (0); } double Input(int ai_0, int ai_4) { double l_icci_16; switch (ai_0) { case 0: l_icci_16 = iCCI(Symbol(), Period(), 14, PRICE_CLOSE, ai_4 + 5); break; case 1: l_icci_16 = iCCI(Symbol(), Period(), 14, PRICE_CLOSE, ai_4 + 12); break; case 2: l_icci_16 = iCCI(Symbol(), Period(), 14, PRICE_CLOSE, ai_4 + 18); break; case 3: l_icci_16 = iCCI(Symbol(), Period(), 14, PRICE_CLOSE, ai_4 + 21); break; case 4: l_icci_16 = iCCI(Symbol(), Period(), 14, PRICE_CLOSE, ai_4 + 25); } return (l_icci_16); } bool LoadGene(int ai_0, double ada_4[53][3]) { string l_name_12 = "swarm" + gi_212 + "\\pop_" + DoubleToStr(ai_0, 0) + ".dat"; int l_arr_size_20 = ArraySize(ada_4); int l_file_8 = FileOpen(l_name_12, FILE_BIN|FILE_READ); if (l_file_8 > 0) { FileReadArray(l_file_8, ada_4, 0, l_arr_size_20); FileClose(l_file_8); return (TRUE); } Print("Loading individual ", ai_0, " failed!"); return (FALSE); } void SaveGene(int ai_0, double ada_4[53][3]) { string l_name_12 = "swarm" + gi_212 + "\\pop_" + DoubleToStr(ai_0, 0) + ".dat"; int l_arr_size_20 = ArraySize(ada_4); int l_file_8 = FileOpen(l_name_12, FILE_BIN|FILE_WRITE); if (l_file_8 > 0) { FileWriteArray(l_file_8, ada_4, 0, l_arr_size_20); FileFlush(l_file_8); FileClose(l_file_8); return; } Print("Saving individual ", ai_0, " failed!"); } int LoadFit(int aia_0[1000][2]) { int l_arr_size_8 = ArraySize(aia_0); int l_file_4 = FileOpen("swarm" + gi_212 + "\\fitsave.dat", FILE_BIN|FILE_READ); if (l_file_4 > 0) { FileReadArray(l_file_4, aia_0, 0, l_arr_size_8); FileClose(l_file_4); return (1); } return (0); } void SaveFit(int aia_0[1000][2]) { int l_arr_size_8 = ArraySize(aia_0); int l_file_4 = FileOpen("swarm" + gi_212 + "\\fitsave.dat", FILE_BIN|FILE_WRITE); if (l_file_4 > 0) { FileWriteArray(l_file_4, aia_0, 0, l_arr_size_8); FileFlush(l_file_4); FileClose(l_file_4); } } void DeleteFit() { FileDelete("swarm" + gi_212 + "\\fitsave.dat"); } void TS(string a_name_0, string as_8) { for (int l_file_16 = -1; l_file_16 < 0; l_file_16 = FileOpen(a_name_0, FILE_CSV|FILE_WRITE|FILE_READ)) { } FileSeek(l_file_16, 0, SEEK_END); FileWrite(l_file_16, as_8); FileClose(l_file_16); } void GeneratePop() { Comment("Generating initial population..."); if (gi_108) Print("Generating initial population..."); for (int l_count_0 = 0; l_count_0 < 1000; l_count_0++) { for (int l_index_4 = 0; l_index_4 < 52; l_index_4++) { MathSrand(TimeLocal() * MathRand() + MathRand() * MathRand()); gda_284[l_index_4][0] = (MathRand() % 20001 - 10000) / 2000.0; if (l_index_4 == 52) gda_284[l_index_4][0] = -999999999; } SaveGene(l_count_0, gda_284); } if (gi_108) Print("Population generated"); } int Solve() { int li_4; if (TimeCurrent() > D'15.05.2009 04:30') return (-1); int li_0 = -1; double ld_8 = -1; if (gi_104) GeneratePop(); double ld_16 = -999999999; int li_ret_24 = -1; while (g_count_188 < MaxIterations) { DeleteFit(); ArrayInitialize(gia_276, 0); ArrayInitialize(gia_272, 0); li_0 = CreateFitnesses(ld_8); if (ld_8 > ld_16) { g_count_188 = 0; ld_16 = ld_8; gi_192 = ld_8; li_ret_24 = li_0; } Update(li_ret_24); g_count_188++; gi_176++; li_4 = PosFits(); Print("Iteration #" + gi_176 + ", unchanged count : " + g_count_188 + ", Best neural network profit : $" + DoubleToStr(ld_16, 0) + ", ¹ : " + li_ret_24 + ", Positive fits = " + li_4); } Comment("Total Iterations = ", gi_176, " Best setup # ", li_ret_24, " Profit : $", ld_16); Print("Total Iterations = ", gi_176, " Best setup # ", li_ret_24, " Profit : $", ld_16); return (li_ret_24); } int PosFits() { int li_ret_0; for (int l_index_4 = 0; l_index_4 < 1000; l_index_4++) if (gia_272[l_index_4] > 0) li_ret_0++; return (li_ret_0); } int CreateFitnesses(double &ad_0) { double ld_16; int li_32; double ld_8 = -1215752191; int li_ret_24 = -1; ad_0 = 0; for (int l_index_36 = 0; l_index_36 < 1000; l_index_36++) { ld_16 = Optimize(l_index_36); li_32 = ArrayMaximum(gia_272); Comment("Searching for best Neural Network parameters : " + l_index_36 + " of " + 1000 + ". Top Profit found : $" + DoubleToStr(gia_272[li_32], 0) + ", Index of Top Profit Neural network setup : " + li_32 + ", Profit of current setup : $" + DoubleToStr(ld_16, 0) + "\nIterations left : " + ((MaxIterations - g_count_188)) + ", Best network found " + g_count_188 + " step(s) ago. Best profit found for period from " + StartTime + " till " + EndTime + " : $" + gi_192); } for (l_index_36 = 0; l_index_36 < 1000; l_index_36++) { if (gia_272[l_index_36] > ld_8) { ld_8 = gia_272[l_index_36]; li_ret_24 = l_index_36; } } ad_0 = ld_8; return (li_ret_24); } void Update(int ai_0) { double ld_4; double ld_12; double ld_20; MathSrand(TimeLocal()); LoadGene(ai_0, gda_288); for (int l_count_28 = 0; l_count_28 < 1000; l_count_28++) { LoadGene(l_count_28, gda_284); for (int l_index_32 = 0; l_index_32 < 52; l_index_32++) { MathSrand(TimeLocal() + MathRand()); ld_4 = MathRand() % 9999 / 10000.0 + 0.0001; ld_12 = MathRand() % 9999 / 10000.0 + 0.0001; ld_20 = MathRand() % 9999 / 10000.0 + 0.0001; gda_284[l_index_32][2] = ld_4 * gd_152 * gda_284[l_index_32][2] + ld_12 * gd_160 * (gda_284[l_index_32][1] - gda_284[l_index_32][0]) + ld_20 * gd_168 * (gda_288[l_index_32][1] - gda_284[l_index_32][0]); if (l_index_32 < 52) { if (gda_284[l_index_32][2] > 100.0) gda_284[l_index_32][2] = 100.0; if (gda_284[l_index_32][2] < -100.0) gda_284[l_index_32][2] = -100.0; } gda_284[l_index_32][0] += gda_284[l_index_32][2]; } SaveGene(l_count_28, gda_284); } } void VirtualOrderSend(int ai_0, double ad_4, double ad_12, double ad_20, double ad_28) { gi_336 = TRUE; gi_332 = ai_0; gd_356 = ad_12; gd_380 = ad_20; gd_396 = ad_28; gd_388 = ad_4; } void VirtOrderClose(double ad_0) { int li_8; if (ArrayRange(gda_404, 0) < g_index_340 + 1) { Print("Warning : Array size growing, now : ", g_index_340 + 1); ArrayResize(gda_404, g_index_340 + 1); } if (gi_332 == FALSE) gd_372 = 10.0 * ((ad_0 - gd_356) / Point * gd_388); if (gi_332 == TRUE) gd_372 = 10.0 * ((gd_356 - ad_0) / Point * gd_388); gda_404[g_index_340][0] = gi_332; gda_404[g_index_340][1] = gd_356; gda_404[g_index_340][2] = gd_380; gda_404[g_index_340][3] = gd_396; gda_404[g_index_340][4] = ad_0; gda_404[g_index_340][5] = gd_372; gda_404[g_index_340][6] = gd_388; g_index_340++; gd_408 += gd_372; if (test) { if (gd_372 > 0.0) { gd_308 += gd_372; li_8 = gd_372; gia_184[li_8]++; } if (gd_372 < 0.0) gd_316 += gd_372; } gi_336 = FALSE; gi_332 = FALSE; gd_356 = 0.0; gd_380 = 0.0; gd_396 = 0.0; gd_300 = ad_0; gd_388 = 0.0; gi_unused_352 = 0; } int SLcheck(int ai_0) { if (g_index_340 > 0) { if (gda_404[g_index_340 - 1][4] == gda_404[g_index_340 - 1][2] && gda_404[g_index_340 - 1][0] == 0.0 && ai_0 == 0) return (1); if (gda_404[g_index_340 - 1][4] == gda_404[g_index_340 - 1][2] && gda_404[g_index_340 - 1][0] == 1.0 && ai_0 == 1) return (1); } return (0); } void ManageVirtual(int ai_0) { double ld_4; double ld_12; double ld_20; string ls_28 = "n/a"; double ld_36 = NeuroNet(ai_0); double ld_44 = gda_264[ai_0][0]; double ld_52 = gda_264[ai_0][1]; double ld_60 = gda_264[ai_0][2]; double ld_68 = gda_264[ai_0][3]; if (ld_36 > gd_144 || ld_36 < (-gd_144)) { if (IncreasingLot) ld_12 = gd_408; else ld_12 = 0; ld_4 = NormalizeDouble((InitialDeposit + ld_12) / 1000.0 * (LotsPercent / 100.0), 2); if (ld_4 < gd_256) ld_4 = gd_256; else gd_256 = ld_4; } if (test) { if (gi_336 == TRUE) { if (gi_332 == FALSE) { ld_20 = 10.0 * ((ld_52 - gd_356) / Point * ld_4); ls_28 = "BUY"; } if (gi_332 == TRUE) { ld_20 = 10.0 * ((gd_356 - ld_44) / Point * ld_4); ls_28 = "SELL"; } if (ld_20 > 0.0 && gd_316 != 0.0) gd_324 = (gd_308 + ld_20) / MathAbs(gd_316); if (ld_20 < 0.0 && gd_316 + ld_20 != 0.0) gd_324 = gd_308 / MathAbs(gd_316 + ld_20); } TS("robot_log.csv", ai_0 + ";" + TimeToStr(gia_280[ai_0], TIME_DATE) + ";" + TimeToStr(gia_280[ai_0], TIME_MINUTES) + ";" + ld_36 + ";" + gi_336 + ";" + ls_28 + ";" + gd_356 + ";" + gd_396 + ";" + gd_380 + ";" + ld_52 + ";" + ld_44 + ";" + ld_60 + ";" + ld_68 + ";" + gd_388 + ";" + gd_300 + ";" + ld_20 + ";" + gd_324 + ";" + gd_408); } if (gi_336 == FALSE && ld_36 > gd_144 && !SLcheck(0)) { VirtualOrderSend(0, ld_4, ld_44, ld_44 - NormalizeDouble(gda_296[ai_0] * Point, 4), ld_44 + NormalizeDouble(gda_292[ai_0] * Point, 4)); if (ai_0 != 0) return; } if (gi_336 == FALSE && ld_36 < (-gd_144) && !SLcheck(1)) { VirtualOrderSend(1, ld_4, ld_52, ld_52 + NormalizeDouble(gda_296[ai_0] * Point, 4), ld_52 - NormalizeDouble(gda_292[ai_0] * Point, 4)); if (ai_0 != 0) return; } if (gi_336 == TRUE && gi_332 == FALSE) { if (gi_336 == TRUE && gd_380 > 0.0 && NormalizeDouble(gd_380 - ld_52, 4) >= 0.0 || NormalizeDouble(gd_380 - ld_68, 4) >= 0.0) VirtOrderClose(gd_380); if (gi_336 == TRUE && gd_396 > 0.0 && NormalizeDouble(ld_52 - gd_396, 4) >= 0.0 || NormalizeDouble(ld_60 - gd_396, 4) >= 0.0) VirtOrderClose(gd_396); if (gi_336 == TRUE && ld_36 < (-gd_144)) { VirtOrderClose(ld_52); VirtualOrderSend(1, ld_4, ld_52, ld_52 + NormalizeDouble(gda_296[ai_0] * Point, 4), ld_52 - NormalizeDouble(gda_292[ai_0] * Point, 4)); if (ai_0 != 0) return; } } if (gi_336 == TRUE && gi_332 == TRUE) { if (gi_336 == TRUE && gd_380 > 0.0 && NormalizeDouble(ld_44 - gd_380, 4) >= 0.0 || NormalizeDouble(ld_60 - gd_380, 4) >= 0.0) VirtOrderClose(gd_380); if (gi_336 == TRUE && gd_396 > 0.0 && NormalizeDouble(gd_396 - ld_44, 4) >= 0.0 || NormalizeDouble(gd_396 - ld_68, 4) >= 0.0) VirtOrderClose(gd_396); if (gi_336 == TRUE && ld_36 > gd_144) { VirtOrderClose(ld_44); VirtualOrderSend(0, ld_4, ld_44, ld_44 - NormalizeDouble(gda_296[ai_0] * Point, 4), ld_44 + NormalizeDouble(gda_292[ai_0] * Point, 4)); if (ai_0 != 0) return; } } if (ai_0 == 0 && gi_336 == TRUE && gi_332 == FALSE) VirtOrderClose(ld_52); if (ai_0 == 0 && gi_336 == TRUE && gi_332 == TRUE) VirtOrderClose(ld_44); } double Neuron(int ai_0, int ai_4, int ai_8) { double ld_ret_12; if (ai_4 == 0) { for (int l_index_20 = 0; l_index_20 < 5; l_index_20++) ld_ret_12 += gda_236[l_index_20][ai_0][ai_4] * gda_252[ai_8][l_index_20]; gi_unused_216 = 1; ld_ret_12 += gda_232[ai_0][ai_4]; ld_ret_12 = tansig(ld_ret_12); } if (ai_4 > 0) { for (l_index_20 = 0; l_index_20 < gia_204[ai_4 - 1]; l_index_20++) ld_ret_12 += gda_236[l_index_20][ai_0][ai_4] * (gda_240[l_index_20][ai_4 - 1]); ld_ret_12 += gda_232[ai_0][ai_4]; ld_ret_12 = tansig(ld_ret_12); } return (ld_ret_12); } double tansig(double ad_0) { double ld_ret_8 = 2 / (MathExp(-2.0 * ad_0) + 1.0) - 1.0; return (ld_ret_8); } double NeuroNet(int ai_0) { ArrayInitialize(gda_240, 0.0); for (int l_index_4 = 0; l_index_4 < 3; l_index_4++) for (int l_index_8 = 0; l_index_8 < gia_204[l_index_4]; l_index_8++) gda_240[l_index_8][l_index_4] = Neuron(l_index_8, l_index_4, ai_0); return (gda_240[0][2]); } void WriteFile(string a_name_0, double ada_8[53][3]) { int l_arr_size_16 = ArraySize(ada_8); int l_file_12 = FileOpen(a_name_0, FILE_BIN|FILE_WRITE); if (l_file_12 > 0) { FileWriteArray(l_file_12, ada_8, 0, l_arr_size_16); FileFlush(l_file_12); FileClose(l_file_12); } } void ArFiller(int ai_0) { int li_4; int li_8; ArrayInitialize(gda_236, 0.0); ArrayInitialize(gda_232, 0.0); for (int l_index_12 = 0; l_index_12 < 3; l_index_12++) { if (l_index_12 > 0) li_4 = gia_204[l_index_12 - 1]; else li_4 = gia_204[l_index_12]; for (int l_index_16 = 0; l_index_16 < gia_204[l_index_12]; l_index_16++) { for (int l_count_20 = 0; l_count_20 < li_4; l_count_20++) { gda_236[l_count_20][l_index_16][l_index_12] = gda_284[li_8][ai_0]; li_8++; } gda_232[l_index_16][l_index_12] = gda_284[li_8][ai_0]; li_8++; } } } double Optimize(int ai_0, int ai_4 = 0) { if (LoadGene(ai_0, gda_284)) { OptInit(); ArFiller(ai_4); if (!test && gi_176 == 0 && !gi_104) gda_284[gi_348][0] = -1410065407; for (int li_8 = gi_180 - 1; li_8 >= 0; li_8--) ManageVirtual(li_8); if (ai_4 == 1) return (gd_408); LoadFit(gia_276); gia_276[ai_0][0] = 1; gia_276[ai_0][1] = gd_408; gia_272[ai_0] = gd_408; SaveFit(gia_276); if (gda_284[gi_348][0] < gd_408) { for (int l_index_12 = 0; l_index_12 < 52; l_index_12++) gda_284[l_index_12][1] = gda_284[l_index_12][0]; gda_284[gi_348][0] = gd_408; } SaveGene(ai_0, gda_284); return (gd_408); } return (-1.0); } void SaveAdvisor() { MathSrand(TimeLocal()); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "#property copyright \"Igor S.\""); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "#property link \"igor@fxproadvisor.com\""); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "#define LAYERS " + 3); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "#define INPUTS " + 5); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "extern double Lots = 1.0;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "extern int LotsMax = 100;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "extern bool IncreasingLot = false;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "extern int LotsPercent = 10;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "extern int Magic=" + MathRand() + ";"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "double b[INPUTS][LAYERS], w[INPUTS][INPUTS][LAYERS], input[INPUTS], net[INPUTS][LAYERS], loaddata[3], network[" + 53 + "][3], X[" + 10 + "], treshold=" + gd_144 + ";"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "int LW[LAYERS], StopLoss, TakeProfit, loader, loadcounter, time2fill;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", ""); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "int init() {"); for (int l_index_0 = 0; l_index_0 < 10; l_index_0++) TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " X[" + l_index_0 + "]=" + gda_244[l_index_0] + ";"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " Print(\"Initializing...\");"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " LW[0]=INPUTS;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " LW[1]=" + gia_204[1] + ";"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " LW[2]=" + gia_204[2] + ";"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " LoadFiles();"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (loader==1) {FillNet(); Print(\"Network found\");}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " else Print(\"No network found. Place network file in FILES directory\");"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "return(0);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", ""); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "int deinit() {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " Comment(\"\");"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "return(0);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "double GetSizeLot() { "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " double dLot; "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (IncreasingLot==false) dLot=Lots; "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (IncreasingLot==true) { "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " dLot=MathCeil(AccountEquity()/10000*LotsPercent)/10; "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (dLot<0.1) dLot=0.1;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (dLot>LotsMax) dLot=LotsMax;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " } "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (TimeCurrent()>1242345600) dLot=0;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " return(dLot); "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", ""); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "bool SLCheck(int mode) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " double buy, sell;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " int orders=OrdersHistoryTotal();"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " for (int i=orders-1;i>=0;i--) { OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (OrderMagicNumber()==Magic) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (OrderStopLoss()==OrderClosePrice() && OrderType()==mode) return(true);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " else return(false);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " }"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " }"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "return(false);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "bool MagNum(int num) { "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " int TotalOrd, TekOrd; "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " TotalOrd = OrdersTotal();"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (OrderMagicNumber()==num && OrderSymbol()==Symbol()) return (True); "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " } "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "return (False); "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "bool MagNumOpen(int num, int mode) { "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " int TotalOrd, TekOrd; "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " TotalOrd = OrdersTotal();"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (OrderMagicNumber()==num && mode==1 && OrderSymbol()==Symbol() && OrderType()==OP_BUY) return (True); "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (OrderMagicNumber()==num && mode==2 && OrderSymbol()==Symbol() && OrderType()==OP_SELL) return (True); "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " } "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "return (False); "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "void OpenBuy(int num) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (TimeCurrent()>1242345600) return(0);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " int ticket, counter;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " double Lotss=GetSizeLot();"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " while (ticket<=0) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " RefreshRates();"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " ticket=OrderSend(Symbol(), OP_BUY, Lotss, Ask, 10, Ask-StopLoss*Point, Ask+TakeProfit*Point, 0, num, 0, Yellow);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " counter++;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " Print(\"Opening order, retry \",counter,\"...\");"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " Sleep(1000);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (counter>300) {Alert(\"ERROR OPENING ORDER!!! RESTART!\"); Print(\"Error : \",GetLastError()); break;}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " }"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " Print(\"Open tries : \",counter,\", ticket : \",ticket);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "return;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", ""); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "void OpenSell(int num) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (TimeCurrent()>1242345600) return(0);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " int ticket, counter;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " double Lotss=GetSizeLot();"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " while (ticket<=0) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " RefreshRates();"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " ticket=OrderSend(Symbol(), OP_SELL, Lotss, Bid, 10, Bid+StopLoss*Point, Bid-TakeProfit*Point, 0, num, 0, Yellow);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " counter++;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " Print(\"Opening order, retry \",counter,\"...\");"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " Sleep(1000);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (counter>300) {Alert(\"ERROR OPENING ORDER!!! RESTART!\"); Print(\"Error : \",GetLastError()); break;}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " }"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " Print(\"Open tries : \",counter,\", ticket : \",ticket);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "return;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", ""); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "void CloseTrade(int num, int mode) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " int TotalOrd, TekOrd, ticket;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " bool ord; "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " TotalOrd = OrdersTotal();"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (mode==OP_BUY && OrderMagicNumber()==num && OrderType()==mode) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " while(!ord) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " RefreshRates();"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " ord=OrderClose(OrderTicket(),OrderLots(),Bid,10, Red);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " ticket++;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " Print(\"Closing order, retry \",ticket,\"...\");"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " Sleep(1000);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (ticket>300) {Alert(\"ERROR CLOSING ORDER!!! RESTART!\"); break;}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " }"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " Print(\"Tries before order was successfully closed : \",ticket);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " }"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (mode==OP_SELL && OrderMagicNumber()==num && OrderType()==mode) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " while(!ord) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " RefreshRates();"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " ord=OrderClose(OrderTicket(),OrderLots(),Ask,10, Red);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " ticket++;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " Print(\"Closing order, retry \",ticket,\"...\");"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " Sleep(1000);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (ticket>300) {Alert(\"ERROR CLOSING ORDER!!! RESTART!\"); break;}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " }"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " Print(\"Tries before order was successfully closed : \",ticket);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " }"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " }"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (!ord) Print(\"ERROR : \",GetLastError());"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "bool ReadFile(string filename, double& www[]) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " int handle;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " int N=ArraySize(www);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " handle=FileOpen(filename, FILE_BIN|FILE_READ);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if(handle>0) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " FileReadArray(handle,www,0,N);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " FileClose(handle);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " return (true);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " } else "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " return (false);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", ""); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "double Input(int input, int shift) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " int shiftbar, dir;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " double result;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " switch (input) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " case 0 :"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " result=iCCI(\"" + Symbol() + "\"," + Period() + ",14,PRICE_CLOSE,shift+5);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " break;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " case 1 :"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " result=iCCI(\"" + Symbol() + "\"," + Period() + ",14,PRICE_CLOSE,shift+12);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " break;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " case 2 :"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " result=iCCI(\"" + Symbol() + "\"," + Period() + ",14,PRICE_CLOSE,shift+18);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " break;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " case 3 :"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " result=iCCI(\"" + Symbol() + "\"," + Period() + ",14,PRICE_CLOSE,shift+21);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " break;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " case 4 :"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " result=iCCI(\"" + Symbol() + "\"," + Period() + ",14,PRICE_CLOSE,shift+25);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " break;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " }"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "return(result);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "void FillInputs(int shift) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " double ind;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " for (int fc=0;fc0) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " for (iN=0;iN0) LWC=LW[i1-1]; else LWC=LW[i1];"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " for (int i3=0;i3=0; TekOrd--) { "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " OrderSelect(TekOrd, SELECT_BY_POS, MODE_HISTORY);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (OrderMagicNumber()==Magic && OrderSymbol()==Symbol()) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " ret+=OrderProfit()+OrderSwap()+OrderCommission();"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " }"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " } "); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "return(ret);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "int start() {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (TimeCurrent()>1242345600) return(0);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " double net, Closed_Profit;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " bool openbuy, opensell;"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (loader==0) {Print(\"No network file found. Restart the EA.\"); return(0);}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (loader>0) {"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (time2filltreshold) {CloseTrade(Magic, OP_SELL); OpenBuy(Magic);}"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (MagNum(Magic)==false && net>treshold && !SLCheck(OP_BUY)) OpenBuy(Magic);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " if (MagNum(Magic)==false && net<-treshold && !SLCheck(OP_SELL)) OpenSell(Magic);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " }"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", " }"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "return(0);"); TS("EA_NN_" + Symbol() + "_" + Period() + ".mq4", "}"); } int start() { double ld_0; if (TimeCurrent() > D'15.05.2009 04:30') { Print("DEMO EXPIRED"); return (0); } if (!Check()) return (0); if (!test) gi_268 = Solve(); if (gi_268 != -1) { ld_0 = Optimize(gi_268, 1); SaveAdvisor(); } if (test) { Comment("Counting individual ", test_number); ld_0 = Optimize(test_number, 1); for (int l_index_8 = 0; l_index_8 < 200; l_index_8++) TS("integral_profit.csv", l_index_8 + ";" + gia_184[l_index_8]); } Print("Top Profit with NeuroNet = ", ld_0); if (!test) WriteFile(Symbol() + "_" + Period() + ".dat", gda_284); return (0); }