Механические Торговые Системы на рынке FOREX. Все для трейдера о Метатрейдер, MQL4 и автоматизации торговли на форексе.

Внимание !!!

Нельзя использовать этого эксперта, в том виде в котором он дан ниже, для торговли на реальном счету. Для этого в нем не хватает дополнительных функций обработки ошибок и защиты от сбоев в работе. Его работа на реальном счету может привести к недовольству со стороны ДЦ, вплоть до блокирования счета.

Код эксперта стохастической системы.

//+------------------------------------------------------------------+
//|                                             stohastic_system.mq4 |
//|                                                    Павел Смирнов |
//|                                                 www.autoforex.ru |
//+------------------------------------------------------------------+
#property copyright "Павел Смирнов"
#property link      "www.autoforex.ru"

extern int TakeProfit=10;
extern int NWave=2;

extern int K=9;
extern int D=3;
extern int slowing=5;
extern int Average_method=2;
extern int price_field=0;

int K_level=0;
int down=0;
int up=0;

void CloseDirect(int cntr, string comm)
  {
    double closeprice;
    if(OrderSelect(cntr,SELECT_BY_POS,MODE_TRADES))
      {
        RefreshRates();
        if (OrderType()==OP_BUY)
          closeprice=Bid;
        else
          closeprice=Ask;
        if (OrderClose(OrderTicket(),OrderLots(),closeprice,10,Green))
        {
          Print(comm, OrderTicket());
        }
        else
          {
            Print("ОШИБКА в CloseDirect():OrderClose() - ",GetLastError());
          }
      }
    else
      {
        Print("ОШИБКА в CloseDirect():OrderSelect() - ",GetLastError());
      }
  }

int init()
  {
   return(0);
  }

int deinit()
  {
   return(0);
  }

int start()
  {
    int ticket=0;
    double stoch_1=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,1);
    double stoch_2=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,2);
    double stoch_3=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,3);
    int Hour_curr=TimeHour(TimeCurrent());

    if ((stoch_1>70)&&(stoch_2>50)) K_level=70;
    if ((stoch_1<30)&&(stoch_2<50)) K_level=30;
    if(OrdersTotal()<1)
      {
        if((Hour_curr>=13)&&(Hour_curr<21))//проверка сигналов только в этот промежуток времени
          {
            if((K_level==30)&&(stoch_1>50.0))//сигнал на покупку
              {
                RefreshRates();
                ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,0,"buy_order1",1,0,Red);
                ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,Ask+TakeProfit*Point,"buy_order2",2,0,Red);
                K_level=50;
                down=0;
              }
            if((K_level==70)&&(stoch_1<50.0))//сигнал на продажу
              {
                RefreshRates();
                ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,10,0,0,"sell_order1",1,0,Blue);
                ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,10,0,Bid-TakeProfit*Point,"sell_order2",2,0,Red);
                K_level=50;
                up=0;
              }
          }
      }

    // блок закрытия всех открытых ордеров в случае, если рынок пошел не в нашу сторону
    if (OrdersTotal()>=1)
      {
        if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
          {
            if(OrderType()==OP_BUY)
              {
                if(stoch_1<=40)
                  while(OrdersTotal()>0)
                    {
                      CloseDirect(0,"Принудительное закрытие сделки при обратном движении рынка, ticket=");
                    }
              }
            if(OrderType()==OP_SELL)
              {
                if(stoch_1>=60)
                  while(OrdersTotal()>0)
                    {
                      CloseDirect(0,"Принудительное закрытие сделки при обратном движении рынка, ticket=");
                    }
              }
          }
        else
          {
            Print("ОШИБКА в Start()(блок закрытия при обратном движении) :OrderSelect() - ",GetLastError());
            return(-1);
          }
      }

    // блок закрытия на 2-ом снижении (повышении) Стохастика.
    if (OrdersTotal()>=1)
      {
        if ((stoch_1<stoch_2)&&(stoch_3<stoch_2)) down++;
        if ((stoch_1>stoch_2)&&(stoch_3>stoch_2)) up++;

        if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
          {
            if(OrderType()==OP_BUY)
              {
                if(down==NWave)
                   while(OrdersTotal()>0)
                    {
                      CloseDirect(0,"Закрытие всех BUY-сделок после второго подьема, ticket=");
                    }
              }
            if(OrderType()==OP_SELL)
              {
                if(up==NWave)
                  while(OrdersTotal()>0)
                    {
                      CloseDirect(0,"Закрытие всех SELL-сделок после второго подьема, ticket=");
                    }
              }
          }
        else
          {
            Print("ОШИБКА в Start():OrderSelect() - ",GetLastError());
            return(-1);
          }
      }

    if (Hour_curr>=22)//безусловное закрытие всех позиций
      {
        while(OrdersTotal()>0)
          {
            CloseDirect(0,"Принудительное закрытие сделки в 22.00, ticket=");
          }
      }

    return(0);
  }

  Copyright © 2007-2017 Павел Смирнов
При использовании материалов сайта ссылка на www.autoforex.ru обязательна.
 
   

Яндекс цитирования Рейтинг@Mail.ru Rambler's Top100