Можно ли к МТ прикрутить другой сервер данных? - страница 2

 

Добрый день. Уважаемые! Подскажите в чем дело. Почему-то не работает стоплосс в простейшем коде. Зла не хватает! Должен же работать, ...ъ!

extern int       MagicNumber=555;
extern double Lots = 0.1;
extern int StopLoss=30;
//-----------------------------------------------------------
int ticket;
int ExpertBars;
//-----------------------------------------------------------
int init()
  {
ExpertBars = Bars;
return(0);
  } 
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
bool isNewBar=false;
if (ExpertBars !=Bars) {ExpertBars=Bars; isNewBar=true; }
if (isNewBar) {// если появился новый бар 
//------------------- сигнал на покупку(Блюдце)---------------------------------
if    (
      (iAO(NULL, 0, 0)> 0)&&
      (iAO(NULL, 0, 2)> iAO(NULL, 0, 1)) &&
      (iAO(NULL, 0, 1)< iAO(NULL, 0, 0))
       )
      ticket=OrderSend(Symbol(),0,Lots,Ask,3,Ask-StopLoss*Point,50,NULL,
                                                          MagicNumber,0,CLR_NONE);
      if (ticket<0){Print("Ошибка открытия ордера BUY #",GetLastError()); return (0);} 
 
//------------------- сигнал на продажу(Блюдце)---------------------------------
if     (
       (iAO(NULL, 0, 0)< 0)  &&
       (iAO(NULL, 0, 2)> iAO(NULL, 0, 1)) &&
       (iAO(NULL, 0, 1)< iAO(NULL, 0, 0)) 
       )
       ticket=OrderSend(Symbol(),1,Lots,Bid,3,Bid+StopLoss*Point,50,NULL,
                                                      MagicNumber,0,CLR_NONE);
                                              
  if (ticket<0){Print("Ошибка открытия ордера SELL #",GetLastError());return (0);}  
//----------------------------------------------------------------------------
 }// если появился новый бар 
return(0);
 }
Уважаемые!
Сам же советник работает. Открывает сделки. И тейкпрофит работает.
 
rid:

Добрый день. Уважаемые! Подскажите в чем дело. Почему-то не работает стоплосс в простейшем коде. Зла не хватает! Должен же работать, ...ъ!

Сам же советник работает. Открывает сделки. И тейкпрофит работает.


Может быть потому, что Баи закрываются Бидом, а Селлы Аском?
На графике отображается только бидовые цены, а асковые подразумеваются. Поэтому, когда селл не закрывается по профиту (хотя очевидно касание свечи), то это не значит, что что-то не так, а значит, что подразумеваемый Аск просто не коснулся линии Профита. Со стопом обратная картина. Ордер закроется, когда свеча ещё не коснулась. Но это значит, что подразумеваемый Аск уже достал линию стопа, а видимый бид ещё нет.
Если в настройках терминала (F8) включить галочку "показывать линию Ask", то картина становится более очевидной.

Замечания по Вашему коду:
Ограничения  по Стопу и Профиту для ордера отсчитываются от цены ЗАКРытия. В коде для Бая указан стоп Ask-StopLoss*Point, это неправильно. Вместо Аска следует указать Бид.
В представленном же коде ордера будут открываться только в случае значений стоп-лосса, вдвое перекрывающего значение StopLevel.
То же для Селлов (зеркально).

 

SK, БЛАГОДАРЮ. Сейчас буду исправлять.

 

В окне MetaEditor'а в окне "Инструментарий" на закладке "Справка" текст несообразных размеров. Все остальное нормально. Как настроить "справку"?

 
Нажмите Ctrl и покрутите колесико мышки.
 
startdata:
Доброго всем дня! Есть вот такой вопрос к знатокам МТ. Можно ли к нему прикрутить другой сервер данных? Мне нужно, чтоб он качал реалтайм не с Альпари, а с ФорексКлуба. Как понял, необходимо для этого создать файл datacenter.ini с параметрами сервера котировок, но при этом необходим соответствующий файл .srv, а что это и с чем его едят я понять не смог - подобный файл Alpari-Demo.srv мне расшифровать не удалось - по идее, ini файлы должны читаться блокнотом, но там такая кодировка, что "перевести" на удобоворимый язык не смог ни чем, сплошная абракадабра! Подскажите, пожалуйста, кто знает - как победить эту проблему? Что нужно прописывать в файле. srv и каков должен быть его формат (кодировка имеет значение?) Заранее спасибо!

Есть только один выход. Береш разных поставщиков это может быть и МТ и другие, вешаеш (индикатор, скрипт, советник) где что можно. Каждый формирует файл котировок. Собираеш эти котировки какой нибудь 1 программой, я пользуюсь MathCad и там же в ней анализируеш. Результаты анализа выкладываеш в виде 0 или 1, которые читает советник и выполняет бай или селл.
 

Добрый вечер! Опять проблема. Придумал эксперта, который оч. неплохо "молотит" по индексам. Причем, "неплохо" - это не то слово! Отлично молотит! Да ещё на пипсовке. (святая правда!. ..) - последние примерно 500 сделок - вне периода оптимизации.

GoldenContract-Demo (Build 211)

Символ FDAXZ7 (DAX - Eurex (09:50 - 00:00) Z7)

Период 1 Минута (M1) 2007.10.19 08:33 - 2007.12.21 15:24

Модель По ценам открытия (только для советников с явным контролем открытия баров)

Ошибки рассогласования графиков 0

Начальный депозит 10000.00

Чистая прибыль 267491.22

Матожидание выигрыша 110.67

Относительная просадка 39.01% (5724.94)

Всего сделок 2417

Короткие позиции (% выигравших) 1194 (48.83%) Длинные позиции (% выигравших) 1223 (49.47%)

Прибыльные сделки (% от всех) 1188 (49.15%)

Убыточные сделки (% от всех) 1229 (50.85%)

Теперь, Нужно поставить советника на демосчетб - проверить окончательно, прежде, чем рубить "бабло" на реале. Однако.... Как всегда, у нас в Империи "всё через ж.....". Оказывается ДЦ, в кот. я навострился поработать с индексами , установил для советников дебильные правила!

"Чтоб жизнь малиной не казалась", они разрешают в экспертах выставлять стопы лишь только, после открытия ордера. Иначе говоря, они велят делать вот так:

int ticket =OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"My Order",16384,0,Green);
Sleep(1000);
OrderModify(ticket,OrderOpenPrice(),Bid - sl * Point,0,0,CLR_NONE);
return(0);}
И никак иначе! Но у меня в советнике заложено несколько по другому. Вот так:
 //---- Цикл открытия ордера  --------------------------------------------------
                           
     Cnt=1;
    while (Cnt <= 5) 
   { 
   Lots=GetSizeLot();
   RefreshRates();
   if (OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid - sl * Point, 
     0,"ГРААЛЬ",  MagicNumber, 0, Blue) > 0) break;     
   else 
   { Print ("Ошибка открытия Sell при перевороте #", 
    ErrorDescription( GetLastError() ), " попытка ", Cnt);
                               
   if (Cnt==5) return(0);  //если за 5 попыток не закрыли - выходим
        Cnt++;
   Sleep(15000); // ждём 15 секунд
   }
Не получается у меня ВСТАВИТЬ СЮДА ихнее условие. Пож. подскажите. ..?
 
 //---- Цикл открытия ордера  --------------------------------------------------
                           
     Cnt=1;
    while (Cnt <= 5) 
   { 
   Lots=GetSizeLot();
   RefreshRates();
   if (OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, 0, 0,"ГРААЛЬ",  MagicNumber, 0, Blue) > 0) 
      {
       Sleep(1000);
       OrderSelect(OrdersTotal(), SELECT_BY_POS);
       OrderModify(OrderTicket(),OrderOpenPrice(),Bid - sl * Point,0,0,CLR_NONE);                
       break;
      }     
   else 
      { Print ("Ошибка открытия Sell при перевороте #", 
        ErrorDescription( GetLastError() ), " попытка ", Cnt);
   if (Cnt==5) return(0);  //если за 5 попыток не закрыли - выходим
        Cnt++;
   Sleep(15000); // ждём 15 секунд
   }
а так разве не работает?
или так

 //---- Цикл открытия ордера  --------------------------------------------------
                           
     Cnt=1;
    while (Cnt <= 5) 
   { 
   Lots=GetSizeLot();
   RefreshRates();
   int ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, 0, 0,"ГРААЛЬ",  MagicNumber, 0, Blue) 
   Sleep(1000);
   OrderModify(ticket,OrderOpenPrice(),Bid - sl * Point,0,0,CLR_NONE);                
   if (tiket<=0) 
      { Print ("Ошибка открытия Sell при перевороте #", ErrorDescription( GetLastError() ), " попытка ", Cnt);
   if (Cnt==5) return(0);  //если за 5 попыток не закрыли - выходим
        Cnt++;
   Sleep(15000); // ждём 15 секунд
   }
 
хм надеюсь замену ticket правильно присобачил :)
 
rid:

Добрый день. Уважаемые! Подскажите в чем дело. Почему-то не работает стоплосс в простейшем коде. Зла не хватает! Должен же работать, ...ъ!

...       )
      ticket=OrderSend(Symbol(),0,Lots,Ask,3,Ask-StopLoss*Point,50,NULL, MagicNumber,0,CLR_NONE);
          )
       ticket=OrderSend(Symbol(),1,Lots,Bid,3,Bid+StopLoss*Point,50,NULL,MagicNumber,0,CLR_NONE);
                                              
Сам же советник работает. Открывает сделки. И тейкпрофит работает.

на мой неопытный взгляд тут тока одна ошибка :(
вместо 50 надо Ask+50*Point
и тогда получится вот так
      ticket=OrderSend(Symbol(),0,Lots,Ask,3,Ask-StopLoss*Point,Ask+50*Point,NULL, MagicNumber,0,CLR_NONE);
          )
       ticket=OrderSend(Symbol(),1,Lots,Bid,3,Bid+StopLoss*Point,Bid-50*Point,NULL,MagicNumber,0,CLR_NONE);
и тогда вроде как заработает :)