nn1





#property copyright "S.Projects"
#property link      "cortex.snowcron.com"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Yellow
#property indicator_minimum 0
#property indicator_maximum 1

// indicator parameters
// To do: read parameters, including weights, from a description file

int nNocInterval = 12;
double dNocRange = 0.012;
int nNocMa = 5;
int nOutLag = 2;

int nLayers = 3;
int arrNeurons[3] = { 17, 5, 1 };
int nNumOfLags = 17;
int arrLags[17] =
    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };

double arrWeights_0[305];
double arrWeights_1[90];
double arrWeights_2[6];

// Layer: 0
arrWeights_0[0] = 0.376436;
arrWeights_0[1] = 0.690657;
arrWeights_0[2] = 0.512335;
arrWeights_0[3] = 0.786179;
arrWeights_0[4] = 0.671377;
arrWeights_0[5] = 0.614279;
arrWeights_0[6] = 0.539750;
arrWeights_0[7] = 0.820380;
arrWeights_0[8] = 0.750566;
arrWeights_0[9] = 0.707890;
arrWeights_0[10] = 0.396094;
arrWeights_0[11] = 0.725720;
arrWeights_0[12] = 0.555349;
arrWeights_0[13] = 0.395257;
arrWeights_0[14] = 0.227280;
arrWeights_0[15] = 0.128274;
arrWeights_0[16] = 0.289072;
arrWeights_0[17] = 0.387067;
arrWeights_0[18] = 0.662450;
arrWeights_0[19] = 1.019812;
arrWeights_0[20] = 0.761206;
arrWeights_0[21] = 0.984280;
arrWeights_0[22] = 0.878235;
arrWeights_0[23] = 0.829384;
arrWeights_0[24] = 0.786234;
arrWeights_0[25] = 1.189799;
arrWeights_0[26] = 1.112219;
arrWeights_0[27] = 1.069424;
arrWeights_0[28] = 0.640762;
arrWeights_0[29] = 0.730670;
arrWeights_0[30] = 0.067006;
arrWeights_0[31] = -0.320953;
arrWeights_0[32] = -0.600880;
arrWeights_0[33] = -0.371686;
arrWeights_0[34] = 0.261142;
arrWeights_0[35] = 0.063323;
arrWeights_0[36] = 0.413053;
arrWeights_0[37] = 0.737687;
arrWeights_0[38] = 0.555759;
arrWeights_0[39] = 0.815068;
arrWeights_0[40] = 0.692078;
arrWeights_0[41] = 0.630406;
arrWeights_0[42] = 0.556191;
arrWeights_0[43] = 0.846380;
arrWeights_0[44] = 0.763236;
arrWeights_0[45] = 0.715549;
arrWeights_0[46] = 0.390297;
arrWeights_0[47] = 0.705948;
arrWeights_0[48] = 0.482014;
arrWeights_0[49] = 0.291501;
arrWeights_0[50] = 0.101741;
arrWeights_0[51] = 0.048724;
arrWeights_0[52] = 0.280508;
arrWeights_0[53] = 0.428389;
arrWeights_0[54] = -6.065296;
arrWeights_0[55] = 0.559039;
arrWeights_0[56] = 1.732407;
arrWeights_0[57] = 2.446417;
arrWeights_0[58] = 2.226664;
arrWeights_0[59] = 1.043498;
arrWeights_0[60] = -0.892194;
arrWeights_0[61] = 0.538670;
arrWeights_0[62] = 1.696599;
arrWeights_0[63] = 2.895421;
arrWeights_0[64] = 1.936742;
arrWeights_0[65] = 0.857415;
arrWeights_0[66] = 1.777173;
arrWeights_0[67] = 1.489486;
arrWeights_0[68] = 0.990452;
arrWeights_0[69] = -0.312611;
arrWeights_0[70] = -2.485575;
arrWeights_0[71] = 5.784152;
arrWeights_0[72] = 0.691233;
arrWeights_0[73] = 1.003065;
arrWeights_0[74] = 0.746760;
arrWeights_0[75] = 0.973191;
arrWeights_0[76] = 0.868018;
arrWeights_0[77] = 0.821039;
arrWeights_0[78] = 0.770604;
arrWeights_0[79] = 1.139881;
arrWeights_0[80] = 1.057454;
arrWeights_0[81] = 1.004390;
arrWeights_0[82] = 0.595049;
arrWeights_0[83] = 0.733458;
arrWeights_0[84] = 0.177670;
arrWeights_0[85] = -0.170966;
arrWeights_0[86] = -0.443584;
arrWeights_0[87] = -0.345470;
arrWeights_0[88] = 0.135814;
arrWeights_0[89] = -0.010206;
arrWeights_0[90] = 0.585687;
arrWeights_0[91] = 1.040471;
arrWeights_0[92] = 0.778059;
arrWeights_0[93] = 0.994592;
arrWeights_0[94] = 0.882501;
arrWeights_0[95] = 0.819930;
arrWeights_0[96] = 0.783313;
arrWeights_0[97] = 1.225092;
arrWeights_0[98] = 1.138965;
arrWeights_0[99] = 1.112052;
arrWeights_0[100] = 0.667895;
arrWeights_0[101] = 0.725504;
arrWeights_0[102] = -0.042205;
arrWeights_0[103] = -0.470107;
arrWeights_0[104] = -0.758346;
arrWeights_0[105] = -0.356139;
arrWeights_0[106] = 0.477461;
arrWeights_0[107] = 0.159831;
arrWeights_0[108] = 0.465873;
arrWeights_0[109] = 0.827723;
arrWeights_0[110] = 0.635881;
arrWeights_0[111] = 0.876557;
arrWeights_0[112] = 0.751904;
arrWeights_0[113] = 0.689548;
arrWeights_0[114] = 0.624036;
arrWeights_0[115] = 0.943642;
arrWeights_0[116] = 0.844483;
arrWeights_0[117] = 0.793347;
arrWeights_0[118] = 0.439269;
arrWeights_0[119] = 0.710473;
arrWeights_0[120] = 0.362673;
arrWeights_0[121] = 0.107347;
arrWeights_0[122] = -0.123129;
arrWeights_0[123] = -0.079149;
arrWeights_0[124] = 0.300953;
arrWeights_0[125] = 0.333110;
arrWeights_0[126] = 36.878339;
arrWeights_0[127] = -34.157785;
arrWeights_0[128] = 13.570499;
arrWeights_0[129] = -9.445193;
arrWeights_0[130] = 5.906855;
arrWeights_0[131] = -2.631383;
arrWeights_0[132] = -3.466850;
arrWeights_0[133] = 1.387212;
arrWeights_0[134] = 1.168750;
arrWeights_0[135] = -1.252440;
arrWeights_0[136] = -4.167107;
arrWeights_0[137] = 7.462264;
arrWeights_0[138] = 4.218665;
arrWeights_0[139] = -10.616881;
arrWeights_0[140] = 2.816792;
arrWeights_0[141] = -0.854816;
arrWeights_0[142] = 0.465124;
arrWeights_0[143] = 3.805423;
arrWeights_0[144] = 17.371809;
arrWeights_0[145] = -10.758329;
arrWeights_0[146] = 4.288758;
arrWeights_0[147] = -3.300900;
arrWeights_0[148] = -1.387066;
arrWeights_0[149] = -0.545407;
arrWeights_0[150] = -0.627846;
arrWeights_0[151] = 0.359405;
arrWeights_0[152] = -0.910465;
arrWeights_0[153] = 1.672222;
arrWeights_0[154] = -1.087077;
arrWeights_0[155] = 1.711690;
arrWeights_0[156] = 1.892743;
arrWeights_0[157] = 1.370835;
arrWeights_0[158] = -1.074922;
arrWeights_0[159] = -2.069598;
arrWeights_0[160] = 2.132245;
arrWeights_0[161] = 3.323435;
arrWeights_0[162] = 3.192245;
arrWeights_0[163] = 0.722216;
arrWeights_0[164] = 0.595036;
arrWeights_0[165] = 2.562026;
arrWeights_0[166] = 4.118245;
arrWeights_0[167] = 2.533825;
arrWeights_0[168] = 0.661547;
arrWeights_0[169] = -0.522384;
arrWeights_0[170] = -0.923482;
arrWeights_0[171] = -0.744284;
arrWeights_0[172] = -0.531758;
arrWeights_0[173] = -1.737114;
arrWeights_0[174] = -0.894963;
arrWeights_0[175] = 0.335197;
arrWeights_0[176] = 2.767129;
arrWeights_0[177] = 0.169424;
arrWeights_0[178] = -1.868230;
arrWeights_0[179] = 2.057215;
arrWeights_0[180] = 0.408584;
arrWeights_0[181] = 0.730536;
arrWeights_0[182] = 0.549013;
arrWeights_0[183] = 0.810092;
arrWeights_0[184] = 0.687577;
arrWeights_0[185] = 0.626130;
arrWeights_0[186] = 0.551439;
arrWeights_0[187] = 0.839836;
arrWeights_0[188] = 0.758454;
arrWeights_0[189] = 0.711269;
arrWeights_0[190] = 0.388133;
arrWeights_0[191] = 0.706349;
arrWeights_0[192] = 0.491137;
arrWeights_0[193] = 0.305519;
arrWeights_0[194] = 0.119262;
arrWeights_0[195] = 0.059367;
arrWeights_0[196] = 0.280111;
arrWeights_0[197] = 0.432421;
arrWeights_0[198] = 11.382900;
arrWeights_0[199] = -2.355699;
arrWeights_0[200] = 0.800231;
arrWeights_0[201] = -0.812782;
arrWeights_0[202] = -1.725548;
arrWeights_0[203] = 0.506914;
arrWeights_0[204] = 3.685745;
arrWeights_0[205] = -1.570360;
arrWeights_0[206] = -0.678070;
arrWeights_0[207] = -1.385545;
arrWeights_0[208] = 0.665419;
arrWeights_0[209] = -2.403472;
arrWeights_0[210] = 0.348713;
arrWeights_0[211] = 0.948801;
arrWeights_0[212] = 3.943966;
arrWeights_0[213] = 0.609010;
arrWeights_0[214] = -2.954932;
arrWeights_0[215] = 6.570737;
arrWeights_0[216] = 1.098680;
arrWeights_0[217] = 0.457162;
arrWeights_0[218] = 0.047123;
arrWeights_0[219] = 0.314413;
arrWeights_0[220] = 0.270546;
arrWeights_0[221] = 0.271241;
arrWeights_0[222] = 0.444340;
arrWeights_0[223] = 0.685449;
arrWeights_0[224] = 0.881795;
arrWeights_0[225] = 0.904727;
arrWeights_0[226] = 0.538997;
arrWeights_0[227] = 0.274688;
arrWeights_0[228] = -0.107260;
arrWeights_0[229] = -0.182735;
arrWeights_0[230] = -0.297917;
arrWeights_0[231] = -0.722563;
arrWeights_0[232] = -1.004438;
arrWeights_0[233] = 2.114029;
arrWeights_0[234] = 0.625319;
arrWeights_0[235] = 1.073737;
arrWeights_0[236] = 0.794572;
arrWeights_0[237] = 1.012257;
arrWeights_0[238] = 0.909403;
arrWeights_0[239] = 0.851104;
arrWeights_0[240] = 0.819041;
arrWeights_0[241] = 1.284499;
arrWeights_0[242] = 1.213157;
arrWeights_0[243] = 1.195116;
arrWeights_0[244] = 0.731964;
arrWeights_0[245] = 0.733472;
arrWeights_0[246] = -0.119051;
arrWeights_0[247] = -0.574390;
arrWeights_0[248] = -0.865588;
arrWeights_0[249] = -0.405175;
arrWeights_0[250] = 0.494158;
arrWeights_0[251] = 0.142718;
arrWeights_0[252] = 0.443620;
arrWeights_0[253] = 0.790221;
arrWeights_0[254] = 0.604280;
arrWeights_0[255] = 0.852407;
arrWeights_0[256] = 0.728354;
arrWeights_0[257] = 0.666281;
arrWeights_0[258] = 0.596990;
arrWeights_0[259] = 0.903026;
arrWeights_0[260] = 0.809120;
arrWeights_0[261] = 0.758782;
arrWeights_0[262] = 0.416953;
arrWeights_0[263] = 0.708992;
arrWeights_0[264] = 0.415040;
arrWeights_0[265] = 0.186673;
arrWeights_0[266] = -0.028387;
arrWeights_0[267] = -0.027435;
arrWeights_0[268] = 0.289143;
arrWeights_0[269] = 0.376176;
arrWeights_0[270] = 0.377669;
arrWeights_0[271] = 0.691528;
arrWeights_0[272] = 0.513124;
arrWeights_0[273] = 0.786421;
arrWeights_0[274] = 0.670892;
arrWeights_0[275] = 0.613345;
arrWeights_0[276] = 0.538605;
arrWeights_0[277] = 0.819386;
arrWeights_0[278] = 0.749119;
arrWeights_0[279] = 0.706133;
arrWeights_0[280] = 0.394004;
arrWeights_0[281] = 0.723393;
arrWeights_0[282] = 0.551766;
arrWeights_0[283] = 0.390955;
arrWeights_0[284] = 0.222564;
arrWeights_0[285] = 0.125193;
arrWeights_0[286] = 0.287931;
arrWeights_0[287] = 0.397175;
arrWeights_0[288] = 0.390177;
arrWeights_0[289] = 0.704718;
arrWeights_0[290] = 0.524964;
arrWeights_0[291] = 0.793337;
arrWeights_0[292] = 0.673926;
arrWeights_0[293] = 0.614109;
arrWeights_0[294] = 0.538623;
arrWeights_0[295] = 0.821537;
arrWeights_0[296] = 0.747044;
arrWeights_0[297] = 0.702102;
arrWeights_0[298] = 0.386249;
arrWeights_0[299] = 0.712341;
arrWeights_0[300] = 0.526445;
arrWeights_0[301] = 0.357474;
arrWeights_0[302] = 0.183363;
arrWeights_0[303] = 0.099539;
arrWeights_0[304] = 0.282065;
arrWeights_0[305] = 0.431269;

// Layer: 1
arrWeights_1[0] = 0.313367;
arrWeights_1[1] = 0.600233;
arrWeights_1[2] = 0.413307;
arrWeights_1[3] = 0.723853;
arrWeights_1[4] = 0.604417;
arrWeights_1[5] = 0.564724;
arrWeights_1[6] = 0.494233;
arrWeights_1[7] = 0.776964;
arrWeights_1[8] = 0.713700;
arrWeights_1[9] = 0.689037;
arrWeights_1[10] = 0.403412;
arrWeights_1[11] = 0.743660;
arrWeights_1[12] = 0.681661;
arrWeights_1[13] = 0.582135;
arrWeights_1[14] = 0.470205;
arrWeights_1[15] = 0.320594;
arrWeights_1[16] = 0.360557;
arrWeights_1[17] = 0.505358;
arrWeights_1[18] = 0.207009;
arrWeights_1[19] = -0.600315;
arrWeights_1[20] = 0.292799;
arrWeights_1[21] = -0.486397;
arrWeights_1[22] = -0.698483;
arrWeights_1[23] = -0.466675;
arrWeights_1[24] = 0.161680;
arrWeights_1[25] = 1.267072;
arrWeights_1[26] = 0.942115;
arrWeights_1[27] = 1.601429;
arrWeights_1[28] = 0.294829;
arrWeights_1[29] = 2.066898;
arrWeights_1[30] = 1.149577;
arrWeights_1[31] = -0.608109;
arrWeights_1[32] = 0.236174;
arrWeights_1[33] = 0.223691;
arrWeights_1[34] = 0.281142;
arrWeights_1[35] = 2.639872;
arrWeights_1[36] = 0.298441;
arrWeights_1[37] = 0.585156;
arrWeights_1[38] = 0.397331;
arrWeights_1[39] = 0.714002;
arrWeights_1[40] = 0.591642;
arrWeights_1[41] = 0.547087;
arrWeights_1[42] = 0.477829;
arrWeights_1[43] = 0.768086;
arrWeights_1[44] = 0.709662;
arrWeights_1[45] = 0.679375;
arrWeights_1[46] = 0.387499;
arrWeights_1[47] = 0.736123;
arrWeights_1[48] = 0.665259;
arrWeights_1[49] = 0.564510;
arrWeights_1[50] = 0.453956;
arrWeights_1[51] = 0.305558;
arrWeights_1[52] = 0.345016;
arrWeights_1[53] = 0.508310;
arrWeights_1[54] = -0.677255;
arrWeights_1[55] = -1.032676;
arrWeights_1[56] = -0.744642;
arrWeights_1[57] = -0.925155;
arrWeights_1[58] = -1.197128;
arrWeights_1[59] = -0.992372;
arrWeights_1[60] = -0.855172;
arrWeights_1[61] = 7.016197;
arrWeights_1[62] = 5.226784;
arrWeights_1[63] = 2.411577;
arrWeights_1[64] = -0.733721;
arrWeights_1[65] = 3.402664;
arrWeights_1[66] = 1.729731;
arrWeights_1[67] = -0.991801;
arrWeights_1[68] = -0.815011;
arrWeights_1[69] = -0.677321;
arrWeights_1[70] = -0.693829;
arrWeights_1[71] = 9.138765;
arrWeights_1[72] = -0.246490;
arrWeights_1[73] = -0.391846;
arrWeights_1[74] = -0.347720;
arrWeights_1[75] = -1.096698;
arrWeights_1[76] = -0.001496;
arrWeights_1[77] = -0.693606;
arrWeights_1[78] = -0.468658;
arrWeights_1[79] = 6.178259;
arrWeights_1[80] = 4.306803;
arrWeights_1[81] = 2.409460;
arrWeights_1[82] = -0.336563;
arrWeights_1[83] = 2.374341;
arrWeights_1[84] = 1.504236;
arrWeights_1[85] = -0.726152;
arrWeights_1[86] = -0.426187;
arrWeights_1[87] = -0.254840;
arrWeights_1[88] = -0.293797;
arrWeights_1[89] = -1.892730;

// Layer: 2
arrWeights_2[0] = -0.626160;
arrWeights_2[1] = 1.717378;
arrWeights_2[2] = -0.485501;
arrWeights_2[3] = 2.751261;
arrWeights_2[4] = 2.323994;
arrWeights_2[5] = 2.047616;


double arrOutput_0[17];
double arrOutput_1[5];
double dNnOutput;

double arrPattern[18];

int nRemoveFirst = 200;
double dE = 2.7182818;

// indicator buffers
double arrNocBuffer[];
double arrNnBuffer[];

int nExtCountedBars = 0;

////////////////////////
int init()
{
    // drawing settings
    SetIndexStyle(0, DRAW_LINE);
    SetIndexShift(0, 0);
    SetIndexEmptyValue(0, 0.0);

    SetIndexStyle(1, DRAW_LINE);
    SetIndexShift(1, 0);
    SetIndexEmptyValue(1, 0.0);

    IndicatorDigits(4);

    string strIndicatorShortName = "forex_nn";
    IndicatorShortName(strIndicatorShortName);

    // indicator buffers mapping
    SetIndexBuffer(0, arrNocBuffer);
    SetIndexBuffer(1, arrNnBuffer);

    return(0);
}
////////////////////
int start()
{
    nExtCountedBars = IndicatorCounted();
    if(nExtCountedBars < 0)
        return(-1);

    // last counted bar will be recounted
    if(nExtCountedBars > 0)
        nExtCountedBars--;

    Noc();
    ApplyNn();

    return(0);
}
///////////////////
// For the selected period:
// CLV = ((Close - Low) - (High - Close)) / (High - Low)
void Noc()
{
    int nPos = Bars - nExtCountedBars;

    while(nPos > 0)
    {
        if(nPos > Bars - nRemoveFirst)
        {
            arrNocBuffer[nPos] = 0.5;
            nPos--;
            continue;
        }

        double dClose = Close[nPos];
        double dLow = Low[ArrayMinimum(Low, nNocInterval, nPos)];
        double dHigh = High[ArrayMaximum(High, nNocInterval, nPos)];

        arrNocBuffer[nPos] = 0.1;

        if(dHigh - dLow > dNocRange)
            arrNocBuffer[nPos] = (((dClose - dLow) - (dHigh -
dClose))
                / (dHigh - dLow)) / 2 + 0.5;
        else
            arrNocBuffer[nPos] = (((dClose - dLow) - (dHigh -
dClose))
                / dNocRange) / 2 + 0.5;

        nPos--;
    }

    if(nNocMa > 1)
        Ema(arrNocBuffer);
}
///////////////////
void Ema(double& arr[])
{
    double dPr = 2.0 / (nNocMa + 1);

    int nPos = Bars - nExtCountedBars;

    while(nPos > 0)
    {
        if(nPos == Bars - 2)
            arrNocBuffer[nPos + 1] = arr[nPos + 1];

        arrNocBuffer[nPos] = arr[nPos] * dPr + arrNocBuffer[nPos + 1]
            * (1 - dPr);
        nPos--;
    }
}
///////////////////
void ApplyNn()
{
    int nPos = Bars - nExtCountedBars - 2;

    while(nPos > 0)
    {
        if(nPos > Bars - nRemoveFirst)
        {
            arrNnBuffer[nPos] = 0.5;
            nPos--;
            continue;
        }

        arrNnBuffer[nPos] = 0.5;

        for(int nLagNo = 0; nLagNo < nNumOfLags; nLagNo++)
            arrPattern[nLagNo]
                = arrNocBuffer[nPos + arrLags[nLagNo] + nOutLag];

        for(int nLayer = 0; nLayer < nLayers; nLayer++)
        {
            // Absolute index of the weight in an array
            int nWeightIdx = 0;

            for(int nNeuron = 0; nNeuron < arrNeurons[nLayer];
                nNeuron++)
            {
                double dLinearCombiner = 0;

                int nInputs = arrNeurons[nLayer];
                if(nLayer != 0)
                    nInputs = arrNeurons[nLayer - 1];

                for(int nInput = 0; nInput < nInputs; nInput++)
                {
                    double dInput;
                    double dWeight;
                    switch(nLayer)
                    {
                        case 0:
                        {
                            dInput = arrPattern[nInput];
                            dWeight = arrWeights_0[nWeightIdx];
                        }
                        break;

                        case 1:
                        {
                            dInput = arrOutput_0[nInput];
                            dWeight = arrWeights_1[nWeightIdx];
                        }
                        break;

                        default:
                        {
                            dInput = arrOutput_1[nInput];
                            dWeight = arrWeights_2[nWeightIdx];
                        }
                        break;
                    }

                    dLinearCombiner += dWeight * dInput;

                    nWeightIdx++;
                }

                switch(nLayer)
                {
                    case 0:
                        dWeight = arrWeights_0[nWeightIdx]; break;
                    case 1:
                        dWeight = arrWeights_1[nWeightIdx]; break;
                    default:
                        dWeight = arrWeights_2[nWeightIdx]; break;
                }

                dLinearCombiner += (-1) * dWeight;
                nWeightIdx++;

                double dActivation = Activation(dLinearCombiner, 0);

                switch(nLayer)
                {
                    case 0:
                        arrOutput_0[nNeuron] = dActivation; break;
                    case 1:
                        arrOutput_1[nNeuron] = dActivation; break;
                    default:
                        dNnOutput = dActivation; break;
                }

            }    // for all neurons

        }    // for all layers

        arrNnBuffer[nPos] = dNnOutput;

        nPos--;

    }    // for all patterns
}
///////////////////
double Activation(double u, int nType)
{
    //double dEx = TANH(u / 2);

    double dPow = MathPow(dE, 2 * u / 2);
    double dEx = (dPow - 1) / (dPow + 1);
    if(dEx == 1 || dEx == -1)
        dEx = dEx * 0.999999999;

    // 0 - sigmoid, 1 - tangent
    if(nType == 0)
        return((dEx + 1) / 2);

    return(dEx);
}



Expert

#property copyright "S.Projects"
#property link "cortex.snowcron.com"

extern double dBuyLevel;
extern double dSellLevel;
extern double dStopLoss;
extern double dTrailingStop;

// ------

double dTakeProfit = 0;

datetime timePrev = 0;
int nBars;
int nSlip = 5;

double dLotSize = 0.1;

int nMagic = 0;

string strExpert = "forex_nn";

// ------

int init ()
{
    nBars = Bars;

    if(Symbol() == "EURUSD" && Period() == 60)
    {
        if(!IsTesting())
        {
            dBuyLevel = 0.21;
            dSellLevel = 0.9;

            dStopLoss = 200 * Point;
            dTrailingStop = 200 * Point;
        }
        else
        {
            dStopLoss = dStopLoss * Point;
            dTrailingStop = dTrailingStop * Point;
        }

        nMagic = 0;
    }

    return(0);
}
// ------
int deinit()
{
    return(0);
}

// ------

int start()
{
    if(Bars < 200)
        return(0);

    if(!IsBarEnd())
        return(0);

    // ------

    double dNoc = iCustom(NULL, 0, "forex_nn", 1, 1);
    double dNocPrev = iCustom(NULL, 0, "forex_nn", 1, 2);

    for(int nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--)
    {
        OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
        if(OrderMagicNumber() == nMagic)
        {
            if(OrderType() == OP_BUY)
            {
                if(dNocPrev >= dSellLevel && dNoc <= dSellLevel)
                {
                    OrderClose(OrderTicket(),
                        OrderLots(), Bid, nSlip, Aqua);
                    break;
                }
            }
            else if(OrderType() == OP_SELL)
            {
                if(dNocPrev <= dBuyLevel && dNoc >= dBuyLevel)
                {
                    OrderClose(OrderTicket(),
                        OrderLots(), Ask, nSlip, OrangeRed);
                    break;
                }
            }
        }
    }

    int nNumOfOpenedOrders = 0;
    for(nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--)
    {
        OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
        if(OrderMagicNumber() == nMagic)
            nNumOfOpenedOrders++;
    }

    if(nNumOfOpenedOrders == 0)
    {
        if(dNocPrev <= dBuyLevel && dNoc >= dBuyLevel)
        {
            OrderSend(Symbol(), OP_BUY, dLotSize, Ask,
                nSlip, Ask - dStopLoss, 0, strExpert,
                nMagic, 0, Aqua);
        }
        else if(dNocPrev >= dSellLevel && dNoc <= dSellLevel)
        {
            OrderSend(Symbol(), OP_SELL, dLotSize, Bid,
                nSlip, Bid + dStopLoss, 0, strExpert,
                nMagic, 0, OrangeRed);
        }
    }

    // ------

    ModifyOrders();

    // ------

    return(0);
}


// ------

void ModifyOrders()
{
    for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)
    {
        OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
        if(OrderMagicNumber() == nMagic)
        {
            if(OrderType() == OP_BUY)
            {
                if(OrderStopLoss() < Bid - dTrailingStop - 5 * Point)
                {
                    OrderModify(OrderTicket(), OrderOpenPrice(),
                        Bid - dTrailingStop, OrderTakeProfit(), 0,
Aqua);
                    break;
                }
            }

            if(OrderType() == OP_SELL)
            {
                if(OrderStopLoss() > Ask + dTrailingStop + 5 * Point)
                {
                    OrderModify(OrderTicket(), OrderOpenPrice(),
                        Ask + dTrailingStop, OrderTakeProfit(),
                        0, OrangeRed);
                    break;
                }
            }
        }
    }
}

// ------

bool IsBarEnd()
{
    bool bIsBarEnd = false;
    if(nBars != Bars)
    {
        bIsBarEnd = true;
        nBars = Bars;
    }

    return(bIsBarEnd);
}






Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar
Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar


Indicator Curves created:

Implements a curve of type DRAW_LINE


Indicators Used:




Custom Indicators Used:
forex_nn

Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy

Other Features: