| / | Форум |
|
BabyBear
16.02.2007 08:37
Думаю, Rosh имел ввиду сделать так
int init() { //---- New_Bar = false; // Print("Init done:New_Bar=",New_Bar); New_Time = iTime(Symbol(),Periods,0); // Print("Init done:New_Time=",New_Time); //---- return(0); }
|
|
HIDDEN
16.02.2007 08:47
А что изменится от того что я принтование закоментирую, ничего.
|
|
HIDDEN
16.02.2007 08:58
Скачал и установил новый терминал. |
|
BabyBear
16.02.2007 09:04
От принта ничего не изменится. но ты закомментировал всё вот так (в последнем файле) int init() { //---- /* New_Bar = false; Print("Init done:New_Bar=",New_Bar); New_Time = TimeCurrent(); Print("Init done:New_Time=",New_Time); */ //---- return(0); } |
|
HIDDEN
16.02.2007 13:43
Вобщем после того как скачал последнюю версию терминала, ошибка
исчезла.
Код собственно такой. //+------------------------------------------------------------------+ //| CheckOpenBar.mq4 | //| Copyright © 2007, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ru/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #define MAGICMA 888555 extern int Periods = 15; // Рабочий таймфрейм для всех индикаторов extern bool OpenBar = true; // Вкл./Откл. открытие на новом баре static datetime New_Time = 0; // Время текущего бара bool New_Bar; int dir = 0; int Errors; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- New_Bar = false; //Print("Init done:New_Bar=",New_Bar); New_Time = iTime(Symbol(),Periods,0); //Print("Init done:New_Time=",New_Time); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- Comment(""); //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int ticket; //---- //Print("Start done:New_Bar=",New_Bar); if (OpenBar == true) { //Print("Вызываем функцию Fun_New_Bar"); Fun_New_Bar(); if (New_Bar == false){ Comment("ЖДЁМ ОТКРЫТИЯ НОВОГО БАРА"); return(0); } else { Comment("ПОЛУЧАЕМ СИГНАЛ"); } } int openorders = GetCurrentOrders(); //---- if (openorders==0) { ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point,"My order #",MAGICMA,0,Green); Errors=GetLastError(); if(Errors!=0) Print("Ошибка (",Errors,") при открытии ордера"); if(Errors==4) RefreshRates(); // Торговый сервер занят if(Errors==8) RefreshRates(); // Слишком частые запросы if(Errors==128) RefreshRates(); // Истек срок ожидания совершения сделки if(Errors==135) RefreshRates(); // Цена изменилась if(Errors==137) RefreshRates(); // Брокер занят if(Errors==138) RefreshRates(); // Новые цены if(Errors==146) RefreshRates(); // Подсистема торговли занята if(ticket>0) OrderPrint(); } return(0); } //+----------------------------------------------------------------------------+ //| Открытие только на новом баре | //+----------------------------------------------------------------------------+ void Fun_New_Bar(){ // Ф-ия обнаружения нового бара New_Bar = false; // Нового бара нет //Print("Fun_New_Bar: New_Time=",TimeToStr(New_Time)); if(New_Time != iTime(Symbol(),Periods,0)){ // Сравниваем время New_Time = iTime(Symbol(),Periods,0); // Теперь время такое if (New_Time == iTime(Symbol(),Periods,0)){ New_Bar = true; } else { New_Bar = false; // Поймался новый бар } } return(New_Bar); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Calculate open positions | //+------------------------------------------------------------------+ int GetCurrentOrders(){ //---- calc open OrderSelect int NumOrders=0; dir=0; for(int i=0;i<OrdersTotal();i++){ OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if( OrderSymbol()!=Symbol()) continue; if (OrderMagicNumber()!=MAGICMA) continue; NumOrders++; if(OrderType()==OP_BUY) dir=1; if(OrderType()==OP_SELL) dir=-1; } return (NumOrders); } Что-бы не плодить несколько веток. Задам вопрос в этой ветке. Хотелось бы гарантированное выставление ордера. Используя тот же самый код. 12 валютных пар, все открываются практически в один и тот же момент времени, понятное дело што вылазиют ошибки от торгового сервера. Восновном 146, проверка ошибок есть в коде. Но нет 100% гарантии что выставится ордер. Делать через цикл не хочу, т.к. сильная загрузка проца идет. Что посоветуете через флаги или как? |
|
xeon
16.02.2007 13:56
Помойму эту ситуацию лучше разруливать например с помощью этого
'Ошибка 146 ("Торговый поток занят") и как с ней бороться'
а другие связанные с торговым сервером с помощью этого http://docs.mql4.com/ru/trading/errors |
|
HIDDEN
16.02.2007 14:09
Это наверное оптимальное решение. |
|
ram25
16.02.2007 16:39
Угу, и проверку на занятость потока IsTradeAllowed()==true не помешает перед отправкой ордера
То Хайден П.С. что-то твои Игры разума притихли, что-то случилось? |
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий