[ARCHIVE] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 5. - 페이지 335

 
borilunad :
그러니 스스로 파헤쳐 보세요! 코드의 각 단어에는 기능이 있으며 변수를 관리하는 데 필요합니다. 이것은 하드 코드가 들어오는 곳입니다. 함수 없이는 할 수 없을 때 사용해야 합니다! Kim에서 나는 필요하지 않은 모든 것을 주석 처리했으며 모든 것이 매우 빠르게 작동합니다! 기억하십시오. 저는 모든 사람에게 많은 조건에서 프로그램을 더 빠르게 실행하는 방법을 물었습니다. 이제 5분 안에 모든 진드기에 대해 1년 동안 테스트가 진행됩니다! 나는 모든 조건과 기능을 샅샅이 뒤져 불필요한 모든 것을 버렸다.

물론 기억합니다. 파헤칠게. 사실 습관을 바꿔야 합니다. 내 코드가 이해하기 쉽지 않다고 말하는 것은 프로그래머가 처음이 아닙니다. 분명히 그것은 ...
 
borilunad :
그러니 스스로 파헤쳐 보세요! 코드의 모든 단어가 함수이지만 변수를 사용해야 합니다 . 이것은 무거운 코드가 들어오는 곳입니다. 함수 없이는 할 수 없을 때 함수를 사용해야 합니다 ! Kim에서 나는 필요하지 않은 모든 것을 주석 처리했으며 모든 것이 매우 빠르게 작동합니다! 기억하십시오. 저는 모든 사람에게 많은 조건에서 프로그램을 더 빠르게 실행하는 방법을 물었습니다. 이제 5분 안에 모든 진드기에 대해 1년 동안 테스트가 진행됩니다! 나는 모든 조건과 기능을 샅샅이 뒤져 불필요한 모든 것을 버렸다.

테스터에서 전략을 확인해야만 변수를 생략할 수 있습니다 .

실제로 이러한 변수의 값은 예를 들어 다시 시작할 때 손실되기 매우 쉽기 때문에 논리를 실행하는 데 필요한 각 값을 적시에 계산해야 합니다 .

 

모두에게 좋은 하루.

칠면조의 글씨는 이미 알아 냈지만 첫 번째 로봇에는 문제가있었습니다. 모든 것이 논리적이고 컴파일러가 맹세하지 않고 로그에 오류가 없지만 테스터의 Expert Advisor가 작동하지 않는 것 같습니다. 차트는 열리지만 이 차트에는 움직임이 없습니다(차트가 움직이지 않음).

아이디어는 다음과 같습니다. 표시기는 구매 또는 판매해야 하는 포인트(항상 양초 시작 시 및 양초 시가)를 제공하는 반면 로봇의 작업은 그러한 구매 포인트를 받은 경우 또는 매도, 반대 주문 닫기, 새 주문 열기 또는 동일한 방향으로 이전 주문 수정(정지 및 TP는 다른 지표에 따라 발행됨)

무엇이 잘못되었는지에 대한 힌트를 주시면 대단히 감사하겠습니다.

코드 자체(기능에 따라 칠면조 이름 변경, 변수 선언 및 오류 처리 섹션 제거):

   // Предварит.обработка

   if (High[ 0 ]!=Low[ 0 ]) return ; //если бар открылся до поступления текущей котировки, выход из start

       vverh = iCustom ( NULL , 0 , "Индикатор дающий точку на покупку" ,Glubina,Pogreshnost, 0 , 0 );   //значение индикатора на покупку
       vniz  = iCustom ( NULL , 0 , "Индикатор дающий точку на продажу" ,Glubina,Pogreshnost, 1 , 0 );   //значение индикатора на продажу
       
   if (vverh== 0 && vniz== 0 )
     {
       Alert ( "Сигнала нет. Эксперт ждёт сигнал." );
       return ;
     }
   if ( Bars < Glubina)                       // Недостаточно баров
     {
       Alert ( "Недостаточно баров в окне. Эксперт не работает." );
       return ;                                   // Выход из start()
     }
   if (Work== false )                               // Критическая ошибка
     {
       Alert ( "Критическая ошибка. Эксперт не работает." );
       return ;                                   // Выход из start()
     }

//--------------------------------------------------------------- 4 --
   // Учёт ордеров
   Symb= Symbol ();                               // Название фин.инстр.
   Total= 0 ;                                     // Количество ордеров
   for (i= 1 ; i<= OrdersTotal (); i++)               // Цикл перебора ордеров
     {
       if ( OrderSelect (i- 1 ,SELECT_BY_POS)== true ) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb) continue ;       // Не наш фин. инструм
         if (OrderMagicNumber()!=MagicNumber)   // Попался ордер открытый не советником
             continue ;
            
         Total++;                               // Счётчик ордеров открытых советником
         if (Total> 1 )                           // Не более одного орд
           {
             Alert ( "Несколько ордеров одного советника. Эксперт не работает." );
             return ;                             // Выход из start()
           }
         Ticket=OrderTicket();                   // Номер выбранн. орд.
         Tip   =OrderType();                     // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                 // SL выбранного орд.
         TP    =OrderTakeProfit();               // TP выбранного орд.
         Lot   =OrderLots();                     // Количество лотов
        }
     }
//--------------------------------------------------------------- 5 --
// торговые критерии
if (vverh> 0 )
  {
   Opn_B= true ;
   Cls_S= true ;
   Opn_S= false ;
   Cls_B= false ;
  }
if (vverh> 0 )
  {
   Opn_S= true ;
   Cls_B= true ;
   Opn_B= false ;
   Cls_S= false ;
  }
  
//--------------------------------------------------------------- 6 --
   
   //расчет стопов
   i_stop= 0 ;
   while (stopov_for_S< 2 )                                                         //ищем 2 последних точки стопа в индикаторе, выбираем изз них самую дальнюю от текущей цены
         {
          for_S = iCustom ( NULL , 0 , "Индюк дающий точки стопов" ,Glubina, 0 ,i_stop);
           if (for_S> 0 )
             {
              stopov_for_S++;
               if (Stop_for_S<for_S) Stop_for_S=for_S;
             }
          i_stop++;
         }
   i_stop= 0 ;
   while (stopov_for_B< 2 )
         {
          for_B = iCustom ( NULL , 0 , "Индюк дающий точки стопов" ,Glubina, 1 ,i_stop);
           if (for_B> 0 )
             {
              stopov_for_B++;
               if (Stop_for_B<for_B) Stop_for_B=for_B;
             }
          i_stop++;
         }
SL_for_B = Stop_for_B-pogreshnostSL;
SL_for_S = Stop_for_S+pogreshnostSL;
TP_for_B=vverh+(vverh-Stop_for_B)*koeff_dvizheniya;
TP_for_S=vniz-(Stop_for_S-vniz)*koeff_dvizheniya;


   // Закрытие и модификация ордеров
   while ( true )                                   // Цикл закрытия и модификации орд.
     {
       if (Tip== 0 && Opn_B== true )                 // Если открыт ордер БАЙ и индикатор дает сигнал на покупку
             {
              OrderModify(Ticket,SL_for_B,TP_for_B, 0 , CLR_NONE ); //меняем стопы текущего ордера бай
               break ;
             }
       if (Tip== 0 && Opn_S== true )                 // Если открыт ордер БАЙ и индикатор дает сигнал на продажу
             {
              RefreshRates();
              Ans=OrderClose(Ticket,Lot,Bid, 50 );         // закрываем БАЙ
                 if (Ans== true )                         // Получилось :)
                    {
                     Alert ( "Закрыт ордер Buy " ,Ticket);
                     break ;                             // Выход из цикла закр
                    }
                 if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
                     continue ;                           // Повторная попытка
             }
      
       if (Tip== 1 && Opn_S== true )
             {
              OrderModify(Ticket,SL_for_S,TP_for_S, 0 , CLR_NONE );
               break ;
             }
       if (Tip== 1 && Opn_B== true )
             {
              RefreshRates();
              Ans=OrderClose(Ticket,Lot,Ask, 50 );
                 if (Ans== true )                         // Получилось :)
                    {
                     Alert ( "Закрыт ордер Sell " ,Ticket);
                     break ;                             // Выход из цикла закр
                    }
                 if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
                     continue ;                           // Повторная попытка
             }
     }
//--------------------------------------------------------------- 7 --
   // Стоимость ордеров
   RefreshRates();                               // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);         // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED); // Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера

   if (Lots > 0 )                                 // Если заданы лоты,то 
      Lts =Lots;                                 // с ними и работаем 
   else                                          // % свободных средств
      Lts= MathFloor (Free*Prots/One_Lot/Step )*Step; // Для открытия

   if (Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                       // Лот дороже свободн.
     {
       Alert ( " Не хватает денег на " , Lts, " лотов" );
       return ;                                   // Выход из start()
     }
//--------------------------------------------------------------- 8 --
   // Открытие ордеров
   while ( true )                                   // Цикл закрытия орд.
     {
      Ticket= 0 ;
       if (Opn_B== true )                           // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                         // Обновление данных
         Alert ( "Попытка открыть Buy. Ожидание ответа.." );
         Ticket= OrderSend (Symb,OP_BUY,Lts,Ask, 50 ,SL_for_B,TP_for_B, "My order #" ,MagicNumber, 0 , CLR_NONE ); //Открытие Buy
         if (Ticket > 0 )                         // Получилось :)
           {
             Alert ( "Открыт ордер Buy " ,Ticket);
             return ;                             // Выход из start()
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
        
       if (Opn_S== true )                           // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                         // Обновление данных
         Alert ( "Попытка открыть Sell. Ожидание ответа.." );
         Ticket= OrderSend (Symb,OP_SELL,Lts,Bid, 50 ,SL_for_S,TP_for_S, "My order #" ,MagicNumber, 0 , CLR_NONE ); //Открытие Sell
         if (Ticket > 0 )                         // Получилось :)
           {
             Alert ( "Открыт ордер Buy " ,Ticket);
             return ;                             // Выход из start()
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
     }
//--------------------------------------------------------------- 9 --
   return ;                                       // Выход из start()
  }

 
If (торговые условия сигнал № 1 )
  {
  } //   Какой код нужен, чтобы тело оператора №1 в случае соответствия, передало управление к оператору  «торговых       условий №2»    

If (торговые условия сигнал № 2 )
  {
  } // Какой код нужен, чтобы тело оператора №2 в случае соответствия, передало управление к оператору «торговых       условий №3 и №4»    

If (торговые условия сигнал № 3 )
  {                                          
   Opn_B= true ;                            
   }
   else
If (торговые условия сигнал № 4 )
  {                                          
   Opn_S= true ;                            
   }
     else
         return ( 0 );

문제의 본질은 다음과 같습니다. 연산자 번호 1,2의 중괄호에 무엇을 넣을지 명확하지 않습니다. 실제로 거래 조건의 준수가 확인되고 더 이상 조치가 수행되지 않습니다.

(4개의 거래 신호, 1번 트리거가 있으며 2번 신호 처리로 제어를 이전하고 2번 트리거로 제어를 전달하고 신호 처리 3번과 4번으로 제어를 전달하고 이미 거래 작업 을 수행하고 있습니다.)

   else
         return ( 0 );

마지막에 넣어야 하나요? 논리적으로 신호 번호 3,4가 작동하지 않으면 고문이 다시 시작해야 합니다.

 
artmedia70 :

테스터에서 전략을 확인해야만 변수를 생략할 수 있습니다 .

실제로 논리를 실행하는 데 필요한 각 값은 적절한 시기에 계산되어야 합니다. 이러한 변수의 값은 예를 들어 다시 시작할 때 손실되기 매우 쉽기 때문 입니다.

하지만 외부에 쓰여진 변수는 손실됩니까? 이것은 일어난 적이 없습니다! 하지만 모든 조건이 내 눈앞에 있고 시작()이 눈앞에 있고, 시작() 밖에 있는 기능에 체크와 마지막 불변의 행동을 맡긴다! 대체로 내가 틀릴 수도 있지만 지금까지는 그것이 나에게 편리하며 레알 마드리드에서 아직 한 번도 실수나 재인용을 받은 적이 없습니다! 나는 항상 당신의 게시물, Artyom 및 alsu , Meat 및 기타와 같은 경험 많은 프로그래머와 uv를 주의 깊게 읽고 있습니다. 중재자! 그러나 아직 모든 것이 내 능력 안에 있는 것은 아니므로 아직까지 명확하지 않은 것을 세세한 부분까지 적용할 수는 없습니다. 모두 감사합니다!
 
barma :

모두에게 좋은 하루.

칠면조의 글씨는 이미 알아 냈지만 첫 번째 로봇에는 문제가있었습니다. 모든 것이 논리적이고 컴파일러가 맹세하지 않고 로그에 오류가 없지만 테스터의 Expert Advisor가 작동하지 않는 것 같습니다. 차트는 열리지만 이 차트에는 움직임이 없습니다(차트가 움직이지 않음).

아이디어는 다음과 같습니다. 표시기는 구매 또는 판매해야 하는 포인트(항상 양초 시작 시 및 양초 시가)를 제공하는 반면 로봇의 작업은 그러한 구매 포인트를 받은 경우 또는 매도, 반대 주문 닫기, 새 주문 열기 또는 동일한 방향으로 이전 주문 수정(정지 및 TP는 다른 지표에 따라 발행됨)

무엇이 잘못되었는지에 대한 힌트를 주시면 대단히 감사하겠습니다.

코드 자체(기능에 따라 칠면조 이름 변경, 변수 선언 및 오류 처리 섹션 제거):

차트의 해당 창에 표시된 표시기 코드 자체가 아닌 EA에서만 표시기 이름을 변경한 경우 EA는 해당 창에서 아무 것도 수신하지 않으며 오류가 발생하지 않습니다. 모든 것이 어드바이저에 표시되지만 표시기로부터 신호를 수신하지 않습니다. 지표의 이름이 같은 방식으로 철자되어 있는지 확인하십시오!
 
borilunad :
차트의 해당 창에 표시된 표시기 코드 자체가 아닌 EA에서만 표시기 이름을 변경한 경우 EA는 해당 창에서 아무 것도 수신하지 않으며 오류가 발생하지 않습니다. 모든 것이 어드바이저에 표시되지만 표시기에서 신호를 수신하지 않습니다. 지표의 이름이 같은 방식으로 철자되어 있는지 확인하십시오!

조언 감사합니다. 모든 것을 다시 확인했으며 작성에 오류가 없습니다. 나는 그들의 작업을 명확하게 하기 위해 포럼의 첫 번째 메시지 텍스트에서만 표시기의 이름을 변경했습니다. 고문의 텍스트에서 칠면조 이름은 "표시기"에 명명된 대로 정확하게 작성됩니다. 폴더. 예: "3.0_figuri_2.3_rasshirenie".

또한 제어를 위해 다른 Expert Advisor(교과서에서)를 선택하고 존재하지 않는 지표의 이름을 iCustom 기능에 입력했습니다. 다음과 같은 일이 발생했습니다. 고문이 실제로 거래를 중단했지만(다른 측면에서 이해할 수 있음) 테스터가 시작되었을 때 차트가 지정된 시작 날짜에서 종료 날짜로 이동했습니다. 차트가 움직이지 않습니다.

다른 누군가가 그러한 문제에 직면했을 수 있습니까?

 
barma :

조언 감사합니다. 모든 것을 다시 확인했으며 작성에 오류가 없습니다. 나는 그들의 작업을 명확하게 하기 위해 포럼의 첫 번째 메시지 텍스트에서만 표시기의 이름을 변경했습니다. 고문의 텍스트에서 칠면조 이름은 "표시기"에 명명된 대로 정확하게 작성됩니다. 폴더. 예: "3.0_figuri_2.3_rasshirenie".

또한 제어를 위해 다른 Expert Advisor(교과서에서)를 선택하고 존재하지 않는 지표의 이름을 iCustom 기능에 입력했습니다. 다음과 같은 일이 발생했습니다. 고문이 실제로 거래를 중단했지만(다른 측면에서 이해할 수 있음) 테스터가 시작되었을 때 차트가 지정된 시작 날짜에서 종료 날짜로 이동했습니다. 차트가 움직이지 않습니다.

다른 사람이 이 문제를 겪었을 수도 있습니다.

표시기의 이름이 폴더가 아니라 해당 코드에서 "짧은 이름"으로 지정되었는지 확인하십시오. 그것에 따르면 고문은 해당 차트와 TF에 여전히 설치되어 있으면 그것을 인식합니다!
 
표시기가 테스터에 무언가를 그리려면 차트에 설치해야하며 EA 자체는 선을 그리지 않습니다.
 
barma :

조언 감사합니다. 모든 것을 다시 확인했으며 작성에 오류가 없습니다. 나는 그들의 작업을 명확하게 하기 위해 포럼의 첫 번째 메시지 텍스트에서만 표시기의 이름을 변경했습니다. 고문의 텍스트에서 칠면조 이름은 "표시기"에 명명된 대로 정확하게 작성됩니다. 폴더. 예: "3.0_figuri_2.3_rasshirenie".

또한 제어를 위해 다른 Expert Advisor(교과서에서)를 선택하고 존재하지 않는 지표의 이름을 iCustom 기능에 입력했습니다. 다음과 같은 일이 발생했습니다. 고문이 실제로 거래를 중단했지만(다른 측면에서 이해할 수 있음) 테스터가 시작되었을 때 차트가 지정된 시작 날짜에서 종료 날짜로 이동했습니다. 차트가 움직이지 않습니다.

다른 누군가가 그러한 문제에 직면했을 수 있습니까?

사무실에서 쉬는 날이므로 일정이 바뀌지 않습니다.