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

 
VoDyaMon:

Если написать простой скрипт, который создает объект типа OBJ_ARROW_RIGHT_PRICE, а потом его же удаляет, то объект не удаляется. Более того командой ObjectType вдруг оказывается что созданный объект не типа OBJ_ARROW_RIGHT_PRICE (==36), а ==22 т.е. простая "стрелка вверх" !!! У меня так у одного или у всех так?

Уже были мнения "экспертов" по этому вопросу: типа почитай справку, или не хватает памяти :) .

Памяти достаточно.

Оказалось, что команда ObjectCreate рисует на графике объект типа OBJ_ARROW_RIGHT_PRICE, который нельзя удалить командой ObjectsDeleteAll(0,OBJ_ARROW_RIGHT_PRICE), но можно удалить командой ObjectsDeleteAll(0,22), как будто у нас не правая ценовая метка а "стрелка верх" . Чей косяк ?

... ... ...

Чтобы удалить объект типа OBJ_ARROW_RIGHT_PRICE следует использовать команду ObjectsDeleteAll(0,OBJ_ARROW), с обязательным указание подокна.

p.s. Объект типа OBJ_ARROW это "стрелка" любая, а не только "стрелка вверх". ObjectCreate(...OBJ_ARROW...) создает сразу "стрелку ввер". Ну и заморочки почему в справке этого нет ?

В эту ветку напишите. Там хотя бы разработчики рядом.
 

Имеется скрипт:

#property show_confirm;
int slip=5;

void start()
{
  for(int i=OrdersTotal()-1;i<=0;i--)
  {
   int p=0; double price=0;
      if(OrderSelect(i,SELECT_BY_POS))
     {
       switch(OrderType())
        {
         case 0: price = MarketInfo(OrderSymbol(),MODE_BID); break;
         case 1: price = MarketInfo(OrderSymbol(),MODE_ASK); break;
         default: break;
        }
         while(p<5)                              
           {                                    
            bool tik= OrderClose(OrderTicket(),OrderLots(),price,slip,Red);
            if(tik==true) 
               break;                   
            else                              
              {
               p++;                              
               Print(__FUNCTION__,"_Error_",GetLastError()); 
               Sleep(1000);                       
              }
           }
     }
 }
}

Который даже не пытается закрыть хоть один рыночный ордер из открытых на данный момент. Почему?

Ошибок в журнал не пишет никаких:

2014.03.10 04:39:11.093 Script closeallmarket AUDUSD,M30: removed
2014.03.10 04:39:11.093 closeallmarket AUDUSD,M30: uninit reason 0
2014.03.10 04:39:11.093 closeallmarket AUDUSD,M30: initialized
2014.03.10 04:39:10.109 Script closeallmarket AUDUSD,M30: loaded successfully
 

Замени

 for(int i=OrdersTotal()-1;i<=0;i--)

на

 for(int i=OrdersTotal()-1;i>=0;i--)
 

Здравствуйте господа профессионалы.Не откажите новичку в программировании, посмотрите код,на правильность написания. Кому не лень разбираться с ним. Это мой первый опыт написания большого кода.На тестере не могу его проверить так как он является мультивалютным .Но торговая система этого стоит. Файл с кодом и индикаторы прилагаю в архиве.



Файлы:
 

Добрый день.

Не могу составить аналог кода с php на mql4:

$massiv = array(
            "1" => 0.2145,
            "2" => 1.5447,
            "3" => 0.3544,
            "4" => 3.6541,
            "5" => 6.5441,
            "6" => 4.3217,
            "7" => 5.8354,
            "8" => 7.6877            
            );
                        
            asort($massiv);
            $i=0;
            foreach ($massiv as $key => $val){$i++;$massiv[$key]=$i;}
            
            $a="";
            ksort($massiv);
            foreach ($massiv as $key => $val){$a=$a.$val.".";}  

То есть из массива

            "1" => 0.2145,
            "2" => 1.5447,
            "3" => 0.3544,
            "4" => 3.6541,
            "5" => 6.5441,
            "6" => 4.3217,
            "7" => 5.8354,
            "8" => 7.6877 

Нужно получить массив

            "1" => 1,
            "2" => 3,
            "3" => 2,
            "4" => 4,
            "5" => 7,
            "6" => 5,
            "7" => 6,
            "8" => 8 

Нужна помощь.

 
Roger:

Замени

на


Оххх... Блин, который раз на те же грабли, спасибо )))
 

Пытаюсь написать простой советник, закрывающий все позиции на счёте при достижении заданных значений прибыли или убытка в валюте депозита (открываюсь по нескольким символам), только он закрывает позиции сразу же при их появлении (((

Никак не пойму, что не так:

input double tp_c = 80.0;
input double sl_c = 120.0;

input int slip=5;

 double profit_c = 0.0;

void OnTick()
  {
   currencyprofit();
   if(profit_c > tp_c || profit_c < sl_c) closeall();
  }

double currencyprofit()
  {
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
         profit_c = profit_c + OrderProfit();
     }
   return(profit_c);
  }

void closeall()
  {
     for(int i=OrdersTotal()-1;i>=0;i--)
     {
      int p=0; double price=0;
         if(OrderSelect(i,SELECT_BY_POS))
        {
          switch(OrderType())
           {
            case 0: price = MarketInfo(OrderSymbol(),MODE_BID); break;
            case 1: price = MarketInfo(OrderSymbol(),MODE_ASK); break;
            default: break;
           }
            bool tik= OrderClose(OrderTicket(),OrderLots(),price,slip,Red);
            if(tik==false) 
              {
               Print(__FUNCTION__,"_Error_",GetLastError()); 
               Sleep(3000);
               break;
              }
        }
     }
  }
 
denis77515:

Здравствуйте господа профессионалы.Не откажите новичку в программировании, посмотрите код,на правильность написания. Кому не лень разбираться с ним. Это мой первый опыт написания большого кода.На тестере не могу его проверить так как он является мультивалютным .Но торговая система этого стоит. Файл с кодом и индикаторы прилагаю в архиве.



Мне крайне интересно как новичок так решительно настроен торговать таким экспертом да еще писать что торговая система этого стоит? Не жалко депозита?


По коду не вдаваясь в суть торгового алгоритма - масса ошибок, никакой попытки оптимизации

Найдите пожалуйста отличия от Ваших функций CountBuy_JPY() CountSell_JPY() CountBuy_GBP() На выходе любой из них вы получите одинаковый результат, в Buy все открытые бай, в других все сэл . Все эти функции попробуйте написать в одной и получить два связанных массива с символами и количеством ордеров по нем, уже сократите код на треть

И до Тестера Вам далеко как до луны. Пишите скрипты по каждой функции и смотрите на печати что получиться, дальше запускайте отладчик и смотрите все переменные. Только так Вы хоть на шаг будете постепенно продвигаться вперед

 
evillive:

Пытаюсь написать простой советник, закрывающий все позиции на счёте при достижении заданных значений прибыли или убытка в валюте депозита (открываюсь по нескольким символам), только он закрывает позиции сразу же при их появлении (((

Никак не пойму, что не так:


Проанализируйте условие ... А совет тот же, пользуйтесь скриптами с выводом на печать, а торговые операции пока закомментируйте и отладчиком
if(profit_c > tp_c || profit_c < sl_c) closeall();   profit_c > 80 ИЛИ  profit_c < 120   
 
evillive:

Пытаюсь написать простой советник, закрывающий все позиции на счёте при достижении заданных значений прибыли или убытка в валюте депозита (открываюсь по нескольким символам), только он закрывает позиции сразу же при их появлении (((

Никак не пойму, что не так:



input double tp_c = 80.0;
input double sl_c = - 120.0; //// minus 120

input int slip=5;

 double profit_c ;

void OnTick()
  {
   currencyprofit();
   if(profit_c > tp_c || profit_c < sl_c) closeall();
  }

double currencyprofit()
  {
   profit_c = 0.0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
         profit_c = profit_c + OrderProfit();
     }
   return(profit_c);
  }

void closeall()
  {
     for(int i=OrdersTotal()-1;i>=0;i--)
     {
      int p=0; double price=0;
         if(OrderSelect(i,SELECT_BY_POS))
        {
          switch(OrderType())
           {
            case 0: price = MarketInfo(OrderSymbol(),MODE_BID); break;
            case 1: price = MarketInfo(OrderSymbol(),MODE_ASK); break;
            default: break;
           }
            bool tik= OrderClose(OrderTicket(),OrderLots(),price,slip,Red);
            if(tik==false) 
              {
               Print(__FUNCTION__,"_Error_",GetLastError()); 
               Sleep(3000);
               break;
              }
        }
     }
  }
Причина обращения: