0
Тут нужно более подробное описание того что нужно. Сейчас есть 4 тейка, добавляем еще один уровень. А куда цена должна дойти, чтобы потом обратно вернуться ниже нового уровня?
avatar

AM2

  • 24 сентября 2015, 14:13
0
Это уже виртуальный трал получается, а это сложнее.
avatar

AM2

  • 24 сентября 2015, 14:05
0
Вот рабочий код, необходимо только до конца отладить функции, работающие с историей.


//+------------------------------------------------------------------+
//|                                                     TimeOpen.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property description "Time Open expert advisor"

#include <stdlib.mqh>

//--- Inputs
extern int    BuySell        = 2;   // 0-бай. 1-селл. 2-бай/селл. 3-селл/бай
extern int    LossCount      = 1;   // количество лосей после которых увеличение лота
extern int    Count          = 1;   // количество открываемых ордеров
extern int    MAGIC          = 123; // магик

extern double Lots           = 1;   // лот
extern double KLot           = 2;   // увеличение лота
extern double MaxLot         = 50;  // максимальный лот

extern string t              = "Время";
extern int    t1             = 3;      // время 1
extern int    t2             = 3;      // время 2
extern int    t3             = 3;      // время 3
extern int    t4             = 3;      // время 4
extern int    t5             = 3;      // время 5
extern int    t6             = 3;      // время 6
extern int    t7             = 3;      // время 7
extern int    t8             = 3;      // время 8
extern int    t9             = 3;      // время 9

int tf[9],k=0;
datetime StartTime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   StartTime=TimeCurrent();

   tf[0]=t1;
   tf[1]=t2;
   tf[2]=t3;
   tf[3]=t4;
   tf[4]=t5;
   tf[5]=t6;
   tf[6]=t7;
   tf[7]=t8;
   tf[8]=t9;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
void OpenOrd(int time)
  {
   int res,err;
   double ask=MarketInfo(OrderSymbol(),MODE_ASK);
   double bid=MarketInfo(OrderSymbol(),MODE_BID);

//--- sell conditions
   if(BuySell==1)
     {
      res=OrderSend(Symbol(),OP_SELL,Lot(),NormalizeDouble(bid,Digits),0,0,0,IntegerToString(time),MAGIC,0,Red);
      if(res<0)
        {
         err=GetLastError();
         Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА SELL: ",err,"(",ErrorDescription(err),")");
           } else {
         RefreshRates();
        }
      return;
     }
   Sleep(1000);

//--- buy conditions
   if(BuySell==0)
     {
      res=OrderSend(Symbol(),OP_BUY,Lot(),NormalizeDouble(ask,Digits),0,0,0,IntegerToString(time),MAGIC,0,Blue);
      if(res<0)
        {
         err=GetLastError();
         Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА BUY: ",err,"(",ErrorDescription(err),")");
           } else {
         RefreshRates();
        }
      return;
     }
   Sleep(1000);

//--- buy sell conditions
   if(BuySell==2)
     {
      //--- buy conditions
      if(LastDealType()==2 || LastDealType()==0)
        {
         res=OrderSend(Symbol(),OP_BUY,Lot(),NormalizeDouble(ask,Digits),0,0,0,IntegerToString(time),MAGIC,0,Blue);
         if(res<0)
           {
            err=GetLastError();
            Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА BUY: ",err,"(",ErrorDescription(err),")");
              } else {
            RefreshRates();
           }
         return;
        }
      Sleep(1000);

      //--- sell conditions
      if(LastDealType()==1 || LastDealType()==0)
        {
         res=OrderSend(Symbol(),OP_SELL,Lot(),NormalizeDouble(bid,Digits),0,0,0,IntegerToString(time),MAGIC,0,Red);
         if(res<0)
           {
            err=GetLastError();
            Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА SELL: ",err,"(",ErrorDescription(err),")");
              } else {
            RefreshRates();
           }
         return;
        }
      Sleep(1000);
     }

//--- sell buy conditions
   if(BuySell==3)
     {
      //--- sell conditions
      if(LastDealType()==1 || LastDealType()==0)
        {
         res=OrderSend(Symbol(),OP_SELL,Lot(),NormalizeDouble(bid,Digits),0,0,0,IntegerToString(time),MAGIC,0,Red);
         if(res<0)
           {
            err=GetLastError();
            Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА SELL: ",err,"(",ErrorDescription(err),")");
              } else {
            RefreshRates();
           }
         return;
        }
      Sleep(1000);

      //--- buy conditions
      if(LastDealType()==2 || LastDealType()==0)
        {
         res=OrderSend(Symbol(),OP_BUY,Lot(),NormalizeDouble(ask,Digits),0,0,0,IntegerToString(time),MAGIC,0,Blue);
         if(res<0)
           {
            err=GetLastError();
            Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА BUY: ",err,"(",ErrorDescription(err),")");
              } else {
            RefreshRates();
           }
         return;
        }
      Sleep(1000);
     }
//---
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int LastDealType()
  {
   int type=0;
   if(OrderSelect(3,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderType()==OP_BUY)
        {
         type=1;//buy  
        }
      if(OrderType()==OP_SELL)
        {
         type=2;//sell  
        }
     }
   return(type);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Losses()
  {
   int loss=0;
   for(int i=OrdersHistoryTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) loss++;
        }
     }
   return(loss);
  }
//+------------------------------------------------------------------+
//|              Last lot size                                       |
//+------------------------------------------------------------------+
double LastLot()
  {
   double lot=0;
   if(OrderSelect(1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderProfit()<0) lot=OrderLots();
     }
   if(lot==0) lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot;
   int i=OrdersHistoryTotal();
   if(OrderSelect(1,SELECT_BY_POS,MODE_HISTORY))
     {
      //if(OrderProfit()>0) break;
      if(OrderProfit()<0 && Losses()>=LossCount)
        {
         lot=LastLot()*KLot;
        }
     }
   if(lot>MaxLot || lot==0) lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(k>9) k=0;
   if(CountTrades()<Count)
     {
      OpenOrd(tf[k]);
      k++;
     }

   Comment("\n  Current Time: ",TimeToString(TimeCurrent(),TIME_SECONDS),
           "\n  Time Frame: ",tf[k],
           "\n  K: ",k,
           "\n  Lot: ",Lot(),
           "\n  Last Deal Type: ",LastDealType(),
           "\n  Losses: ",Losses(),
           "\n  Last Lot: ",LastLot());
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 24 сентября 2015, 13:52
0
Вы самостоятельно занимались отладкой?
avatar

AM2

  • 24 сентября 2015, 13:36
0
Заработала функция, которая считает лосей, значит можно попробовать отладить остальные функции.
avatar

AM2

  • 24 сентября 2015, 13:10
0
Я посмотрел на гранде, там советник не видит историю вообще. Т.е. те функции где советник смотрит тип предыдущей сделки или ее профит не работают.
avatar

AM2

  • 24 сентября 2015, 12:49
0
Если в положительной зоне то это тоже самое, что я добавил еще один тейк.
Если нужен стоп при отрицательном профите, добавлю.
avatar

AM2

  • 24 сентября 2015, 12:45
0
Что означает стоп будет положительным?
avatar

AM2

  • 24 сентября 2015, 12:11
0
Cейчас буду смотреть.
avatar

AM2

  • 24 сентября 2015, 11:48
+1
Мне было интересно реализовать что то подобное как в видео. Между МТ брокерами есть свободные коды в сети, но я не пробовал. Есть также обсуждения на форумах на эту тему. А вот тему по обмену данными между МТ и терминалами других разработчиков по Win Api или FIX протоколу найти не удалось. Поэтому пришлось осваивать все с нуля. По Win Api есть дополнительные плагины к терминалам поставщиков котировок, но это дорогое удовольствие.
avatar

AM2

  • 23 сентября 2015, 23:03
0
Лучше всего если советник переделает Андрей, но я уже исчерпал свой лимит заказов в этом месяце.


Если не получится переделать, разместите новый топик и я посмотрю что можно сделать.
avatar

AM2

  • 23 сентября 2015, 18:52
+1
Да, между саксобанком и ДЦ с МТ4, МТ5.
avatar

AM2

  • 23 сентября 2015, 17:49
0
При запуске сам пересчитывает.
avatar

AM2

  • 23 сентября 2015, 17:41
0
Под 4, но есть пересчет на 3 и 5.
avatar

AM2

  • 23 сентября 2015, 13:35
0
Я сейчас с чужим кодом предпочитаю не заморачиваться. Реализовал вот такой вариант: www.opentraders.ru/downloads/869/

avatar

AM2

  • 23 сентября 2015, 12:53
0
Сейчас сигналит 1 раз: www.opentraders.ru/downloads/874/

avatar

AM2

  • 23 сентября 2015, 12:08
0
Завтра посмотрю что можно сделать.
avatar

AM2

  • 22 сентября 2015, 21:55