Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1100

 
e-partner:
Здравствуйте, коллеги!

У меня при программировании появился вопрос: а можно ли как-то получить в Советнике время сервера с точностью до миллисекунд?
Например, получаем: 23.09.2016 14час. : 53мин. : 54000 миллисекунд? То есть ровно в 54 секунды, 000 м/сек.

Интересный вопрос. Что Вы имеете в виду, уточнить последнее известное время сервера, время прихода последней котировки TimeCurrent() или текущее время на сервере?

Если TimeCurrent(), то какой от этого прок, если учесть, что пакет с новой котировкой идет по сети Интернет от сервера к терминалу 10-500 мс, и время это от пакета к пакету меняется. К тому же нет определенности, что такое приход последней котировки, если они идут на сервер из нескольких источников, провайдеров ликвидности, после чего идет обработка, затем рассылка сервером нового тика. Кроме того, неизвестно, как системный таймер сервера синхронизирован с астрономическим временем. 09.01.2014 с 04:15 по 06:15 МСК (четверг, торговый день) я это выяснял, как отклонение не от астрономического, а от среднего для 31 компании. На рисунке для 25 моментов времени показаны эти отклонения (в секундах, не в мс):

И какой смысл выяснять что-либо в миллисекундах по данным от сервера?

Второй вариант понятнее. Если на Вашем компьютере синхронизация времени с астрономическим осуществляется c известной Вам погрешностью, с такой же погрешностью известно астрономическое время (с учетом разности поясов) в населенном пункте, где работает сервер. Только зачем оно...

[Deleted]  

Куда - то из тестера стратегий делась оптимизация. Галки все стоят ничего понять не могу. МТ4 билд 1010. Виндовс 8.1.

Подскажите как активировать оптимизацию.

Скрины прилагаю. Пропала кнопка оптимизировать.

Файлы:
desktop.zip  129 kb
 
Почему у меня MT4 b1010 не позволяет отладку на исторических данных (не активна кнопка и пункт меню)? В MT5 все ок.
 
Патамушта разработчики запретили.
 
int Magik;
int Slippage = 5,stopL1 = 50,takeP1 = 20;
int trend,TicketS,TicketB;
double rsi,TP,SL;
 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{ 
if(Digits == 3 || Digits == 5)
   {
     Slippage *= 10;
     stopL1   *= 10;
     takeP1   *= 10;
   }
   

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
 double priseBuy = FindLastOrderPrise (OP_BUY);
 double priseSel = FindLastOrderPrise (OP_SELL);
double frezeelevl = MarketInfo(OrderSymbol(),MODE_FREEZELEVEL); 
  rsi = iRSI(Symbol(),PERIOD_D1,7,PRICE_CLOSE,0);
  trend = WhatTrend();
if (CountTrades() == 0)
 {
   if(trend == 1 && rsi <=30)
   {
     if(OrderSend(Symbol(),OP_BUYLIMIT,0.10,Ask,Slippage,0,0,"первый ордер бай установлен",Magik,0)== true)
      { 
          TicketB = FindLastTicket(OP_BUY);
          if(TicketB >0)
          {
             SL = priseBuy + NormalizeDouble(takeP1 * Point,Digits);
             TP = priseBuy - NormalizeDouble(stopL1 * Point,Digits);
             if(OrderModify(TicketB,priseBuy,SL,TP,0)== true)
             Comment("урааааааа");
            
          }

        
      }
     
   }//   if(trend == 1 && rsi <=30)
   else if(trend == 2 && rsi >= 70)
   {
     if(OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0)== true)
      {
        for(int i = OrdersTotal()-1;i >0;i--)
         {
           OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES);
            if (OrderType()== OP_SELL && OrderMagicNumber() == Magik)
             {
               double sl = OrderOpenPrice() + NormalizeDouble(stopL1 * Point,Digits);
               double tp = OrderOpenPrice() - NormalizeDouble(takeP1 * Point,Digits);
               if(OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)==true)break;
                else continue;
             }
         }
      }
   }    
 }//if (CountTrades() == 0)

 
   

}

прошу компетентных програмистов обьяснить в чем моя ошибка?? почему ордер не модифицируется!!!и компилятор не выдает ошибок при этом 

 

 
Я изучил учебник.прочитал и законспектировал..Вы могли бы конкретно указать на ошибки.. потому что компилятор ошибок не выдает и в тестере ошибок нет.но ордер не модифицируется.как будто ордер модифи вовсе не видно в программе
 
burbur87:
Я изучил учебник.прочитал и законспектировал..Вы могли бы конкретно указать на ошибки.. потому что компилятор ошибок не выдает и в тестере ошибок нет.но ордер не модифицируется.как будто ордер модифи вовсе не видно в программе

Читайте внимательно что возвращает OrderSend()

 if(OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0) > 0)

 

Да и вообще я бы сделал так:

   int ticket=OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0);
   if(ticket>=0)
      {
        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
          {
            if (OrderStopLoss()==0 || OrderTakeProfit()==0)
             {
               double sl = OrderOpenPrice() + NormalizeDouble(stopL1 * Point,Digits);
               double tp = OrderOpenPrice() - NormalizeDouble(takeP1 * Point,Digits);
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)) Print("Error ",GetLastError()," modify order ",ticket);
             }
          }
      }
 
Sepulca:

Читайте внимательно что возвращает OrderSend()

if(ticket>=0)

Да и вообще я бы сделал так:

Разве тикет может быть равен нулю?
 
AlexeyVik:
Разве тикет может быть равен нулю?

Из документации о OrderSend():

.......

Возвращаемое значение

Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). 

 
Sepulca:

Из документации о OrderSend():

.......

Возвращаемое значение

Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). 

И я о том-же... Номер тикета не может быть 0 даже в тестере, а при ошибке функция возвращает -1 что меньше 0. Вот и спросил, в каком случае тикет может быть равен нулю... Ведь в условии написано >= то-есть больше или равно...