[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 485

 

Спасибо ! Код стал проще. Безусловно проще. 

За  Slippage спасибо! 

Цикл  for (int A = 0; A <100 ; A++) // ни к чему этот перебор баров он только для того, что бы я видел , хотя бы по журналу, что советник выставил-таки ордера именно там, где стрелочки, или номер ошибок.  Дело имено в том, что в тестере не было сигналов. Я видел по тем же принтам, что там переменные стрела1 и 2 на всех барах только лиш ноль, и я так вот вышел из положения.

Цикл можно конечно считать в любую сторону.   А я опять всюду вижу ошибку 129!   Я вижу на графике стрелочки индикатора и хочу убедиться, что имено по ним были выставлены ордера. Так вот, на скрине   вначале переменные стрела 1и2 равны, далее на 17 баре от нулевого, выставляется ордер- о кей, супер!!        Далее чиредуются сообщения принта что есть селл с таким-то тиком, а стрелы на дальнейших барах равны- прекрасно!!!  

 

 
Далее нужно на красной стрелочке удалить селл и выставить бай. Вдруг удаляются два ордера!!! Два- тот что явно выставился и ещё какой-то, которого вроде не было!! Ладно, чёрт с ним...  Вылазит ошибка 129, и ордера нет! Вы уж извините, что я всех добрых добровольцев помощников так всех озадачиваю..
 
//+------------------------------------------------------------------+
//|                                                     советник.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#include <WinUser32.mqh>
  extern double  lot         = 1;                          
  extern int     taymfreym   = 0 ;                           
  extern double  stoplos     = 200 ;                          
  extern double  takeprofit  = 500 ; 
  extern int     magicnumber = 350;
  extern int     ControlBar  = 1;      // номер бара на котором снимаем показания индикатора                     


void BreakPoint()
{//if (!IsVisualMode()) return(0);
    keybd_event (19,0,0,0);
    Sleep (10);
    keybd_event (19,0,2,0);
}

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   Print (   "  НачалоНачал " ); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int i;
int start()
{
  //Print (   "  Начало " ); 
//----
    for (int A = 0; A <100 ; A++) // ни к чему этот перебор баров
    {
        double strela1 = iCustom (NULL, taymfreym, "индикатор", 2, A),
               strela2 = iCustom (NULL, taymfreym, "индикатор", 3, A);
        int BUY = 0, SELL = 0, ticket; 
        Print (A, "  strela1 " , strela1 , "    strela2  " , strela2);
    
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {  
        if (!OrderSelect (i - 1, SELECT_BY_POS)) continue;  // Если есть следующий
        if (OrderSymbol() != Symbol()) continue;      // Не наш фин. инструм
        if (OrderMagicNumber() != magicnumber) continue;
        int type = OrderType();
        if (type > 1) continue;
        ticket = OrderTicket();
        if (type == 0) {BUY++; Print ("BUY++   " , BUY  ,"  ticket ", ticket); break;}
        if (type == 1) {SELL++; Print ("SELL++   " , SELL  ,"  ticket ", ticket); break;}
    }
    if (strela1 < strela2)
    {
        if (SELL > 0) udalenie (OP_SELL);
        if (BUY == 0)
        {
            OrderSend (Symbol( ), OP_BUY, lot,NormalizeDouble(Ask, Digits), 3, NormalizeDouble( Bid- (stoplos*Point),Digits),   NormalizeDouble( Ask+( takeprofit*Point),Digits), NULL, magicnumber, 0, CLR_NONE);           
            Print ("strela1>strela2&&BUY==0&&SELL==0   " , GetLastError()  ,"  Ask ",Ask,"   stoplos= NormalizeDouble( Bid- (stoplos*Point),Digits)  ",
            NormalizeDouble ( Bid- (stoplos*Point),Digits),"    takeprofit= NormalizeDouble( Ask+( takeprofit*Point),Digits) ", NormalizeDouble( Ask+( takeprofit*Point),Digits));
        }
    }
    else if (strela1 > strela2)
    {
        if (BUY > 0) udalenie (OP_BUY);
        if (SELL == 0)
        {
            OrderSend (Symbol( ), OP_SELL, lot, NormalizeDouble (Bid, Digits), 3, NormalizeDouble( Ask+ (stoplos*Point),Digits),   NormalizeDouble( Ask-( takeprofit*Point),Digits), NULL, magicnumber, 0, CLR_NONE) ; 
            Print ("strela1>strela2&& OP_SELL  " , GetLastError()   ,"  Bid ",Bid,"    stoplos=   NormalizeDouble( Ask- (stoplos*Point),Digits)  ",
            NormalizeDouble (Ask- (stoplos*Point),Digits),"    takeprofit= NormalizeDouble( Bid+( takeprofit*Point),Digits) ", NormalizeDouble(Ask+( takeprofit*Point),Digits));
            Print( "strela1>strela2&& OP_SELL   " , GetLastError()  ," (stoplos*Point) ",(stoplos*Point),"   Point  ", Point,"   Digits  ", Digits);
        }
    }
    }
    BreakPoint();     
//----
    return (0);
}
//+------------------------------------------------------------------+

void udalenie (int Type = -1)
{
    int total = OrdersTotal();
    for (i = total - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS)) continue;
        if (OrderSymbol() != Symbol()) continue;      // Не наш фин. инструм
        if (OrderMagicNumber( ) != magicnumber) continue;
        int type = OrderType();
        if (type > 1) continue;
        if (Type > -1) if (Type != type) continue;
        bool result = false;
        switch (type)
        { 
            case OP_BUY       : result = OrderClose (OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 3, CLR_NONE ); break;
            case OP_SELL      : result = OrderClose (OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 3, CLR_NONE ); break; 
        }
        if (!result)
        {
            int error =  GetLastError(); 
            string errorcomment = "Неудалось закрыть ордер №" + OrderTicket() + " " + Symbol() + " " + OrderType() + " " + error; 
            Print (errorcomment);
        }  
    }       
}
 
Погодите, извините, я таки слипы проставлю всюдочки!
 
Dimka-novitsek:
Далее нужно на красной стрелочке удалить селл и выставить бай. Вдруг удаляются два ордера!!! Два- тот что явно выставился и ещё какой-то, которого вроде не было!! Ладно, чёрт с ним...  Вылазит ошибка 129, и ордера нет! Вы уж извините, что я всех добрых добровольцев помощников так всех озадачиваю..

Димка - давай мне свой код в личку - я поковыряю - мне пока делать нечего, пока мой "грааль" тестируется ... а мозг требует нагрузочки ... и индюк не забудь ...  
 

Всем привет, я новичок, поэтому прошу дико не пинать. Накопилось несколько вопросов.

1) Где можно скачать полную историю котировок. Как я понял в терминате МТ4 по умолчанию скачиваются котировки с  MetaQuotes, но там обнаружилась дыра с января 2012 по октябрь 2012 и при повторной загрузке она не закрывается. Это ставит под сомнгение вообще всю историю оттуда.

2) В истории есть даты до 1999 года, данные по ним какие то странные, их очень мало, даже по минуткам. Их вообще кто-нибудь учитывает или удалить их.

3) И еще какая-то ерунда твориться при тесте. Решил попробовать написать советник, простой как проба пера: Buy при Open[1]<MA1 && Close[1]>MA1, Sell всё наоборот соответственно. Так вот при тесте, МА(экспоненциальная) всегда показывает разные значения в зависимости от начальной даты тестирования. При этом чем больше период МА (например 1000-1200) тем больше погрешность. В чем проблема?

 
Dimka-novitsek:

Спасибо ! Код стал проще. Безусловно проще. 

За  Slippage спасибо! 

Цикл  for (int A = 0; A <100 ; A++) // ни к чему этот перебор баров он только для того, что бы я видел , хотя бы по журналу, что советник выставил-таки ордера именно там, где стрелочки, или номер ошибок.  Дело имено в том, что в тестере не было сигналов. Я видел по тем же принтам, что там переменные стрела1 и 2 на всех барах только лиш ноль, и я так вот вышел из положения.

Цикл можно конечно считать в любую сторону.   А я опять всюду вижу ошибку 129!   Я вижу на графике стрелочки индикатора и хочу убедиться, что имено по ним были выставлены ордера. Так вот, на скрине   вначале переменные стрела 1и2 равны, далее на 17 баре от нулевого, выставляется ордер- о кей, супер!!        Далее чиредуются сообщения принта что есть селл с таким-то тиком, а стрелы на дальнейших барах равны- прекрасно!!!   

Про цикл: 

for (int A = 0; A <100 ; A++)

Прежде, чем что-либо делать (писать код) нужно ЧЁТКО представлять - чего хотим получить. У Вас и так на каждом тике пересчитывается этот индикатор и Вы можете иметь полную раскладку по его показаниям. В таком виде (цикл) Вы на выходе в переменных strela1 и strela2 будете иметь показания на 100-м баре и по этим показаниям (прошлой зимы) торгуете... :))) Не сразу обратил внимание - Вы ОПЯТЬ включили торговые опреации в цикл перебора показаний индикатора - полный П... Вам, конечно, виднее. :)))

 
Да нет, цикл нужен мне , что бы увидеть вход-выход, ну, то есть, протестировать робота. Как он ордера ставит, ошибки там. Ну не тестится он в тестере..
 
Dimka-novitsek:
Да нет, цикл нужен мне , что бы увидеть вход-выход, ну, то есть, протестировать робота. Как он ордера ставит, ошибки там. Ну не тестится он в тестере..

Что можно сказать - ГЕНИАЛЬНО... удачи!

P.S. Обнаружил в своём коде маленькую ошибку в связи с изменением направления перебора ордеров, ещё уменьшил код, а также сделал попытку создать оптимизируемость в тестере (проверите сами). 
И есть подозрение, что Вы не правильно снимаете данные с индикатора. У индикатора несколько буферов (в моём варианте 4). В некоторых, например, в тех, которые рисуют стрелочки - значение есть ТОЛЬКО там, где стрелочка. Искать сигналы в таких буферах нужно организацией цикла (while()) с условием, что возвращаемое значение не будет равно (в моём варианте EMPTY_VALUE) "пустому" значению. Там, где "не стрелочки" (в этих буферах) нужно искать сигнал посредством сравнения возвращаемого значения и цены.

Файлы:
lxvhlxyx.mq4  5 kb
 

Доброго дня или ночи! Вопрос как бы к разработчикам mt4, ну и всем остальным тоже.

Какие всё же минимальные системные требования у MT заложены в сам клиент?

 Хотел запустить на старом железе: Атлон 800мгц, 512mb, XP SP3. При запуске MT 4 или 5, сразу сворачивается через 2 секунды. Проблема явно не в винде или в железе, на этом железе стоит Visual Studio с отладчиком (сам я программист), и исключение возникает не в системе (т.к отладчик у меня не срабатывает). И я так понимаю самому клиенту что то не нравиться и он в итоге сворачивается. Ну и вопрос, в чем же причина и что же mt не нравиться, неужели частота цпу ? )) 

Причина обращения: