MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 101

 
Vitaly Muzichenko :
불명. 고문을 중지해야 하는 경우 제안된 옵션이 이에 대처하고 중지할 필요가 없으면 거래를 허용하고 그를 제한하지 마십시오. 중지 후 주문형 거래를 해야 하는 경우 시간을 전환하면 Disabled가 true가 되고 프로그램이 계속 작동합니다.
알았어 고마워.
 
trader781 :
알았어 고마워.

입력 매개변수를 설정할지 여부를 선택하고 싶을 것입니다. "종가 후에 거래합니까, 아니면 종가 후에 거래하지 않습니다"?

그렇다면 다음과 같습니다.

extern bool OneTrade = true ;

// OnTick
if (OneTrade && !Disabled) return ;

깃발에 무뚝뚝한 것 같진 않은데

 
Vitaly Muzichenko :

입력 매개변수를 설정할지 여부를 선택하고 싶을 것입니다. "종가 후에 거래합니까, 아니면 종가 후에 거래하지 않습니다"?

그렇다면 다음과 같습니다.

extern bool OneTrade = true ;

// OnTick
if (OneTrade && !Disabled) return ;

깃발에 무뚝뚝한 것 같진 않은데

모든 것이 이해되었습니다. 이것이 제가 놓친 것입니다. 변수를 적절히 배치하면 하나의 변수로 충분하다고 생각했습니다.
 
Vitaly Muzichenko :

고맙습니다!

문제는 이 항목이 얼마나 정확한지, 프로그램의 시작 부분에 있으며 프로그램 전체에서 많은 Time[0] 및 Time[1]이 사용되며 매번 호출되지 않도록 변수로 작성되었습니다. 배열 범위를 벗어난 오류는 없는 것 같지만 모든 것이 표면적으로 정의되어 있습니다.

datetime TM[], TIME0, TIME1;

//------------
void OnTimer ()

ArraySetAsSeries (TM, true );
   if ( CopyTime ( _Symbol , PERIOD_CURRENT , 0 , 2 , TM)==- 1 ) return ;
   TIME0 = TM[ 0 ];
   TIME1 = TM[ 1 ];

고맙습니다!

기본적으로 변수에 액세스하는지 배열 셀에 액세스하는지 여부는 중요하지 않습니다. 얻는 속도에 불과할 수도 있겠지만, 미시적이라고 생각하고 변수로 측정을 하고 어레이에 직접 접근합니다.
 
Vitaly Muzichenko :

좀 수정 부탁드려도 될까요?

현재 가격 에 수직선 배치

또는 유사한 내용이 있는 고문에 대한 링크

작동하도록 봇 주변에 매개변수를 분산하는 방법을 이해하고 싶습니다.

 
trader781 :

조금 수정 부탁드려도 될까요?

현재 가격 에 수직선 배치

또는 유사한 내용이 있는 고문에 대한 링크

작동하도록 봇 주변에 매개변수를 분산하는 방법을 이해하고 싶습니다.

먼저 따옴표 표시를 90도 회전해야 합니다.
 
Alexey Viktorov :
먼저 따옴표 표시를 90도 회전해야 합니다.

포스트 998

수평이든 수직이든 상관없어, 내가 한 일이 작동하지 않는 것뿐이야

 
trader781 :

포스트 998

수평이든 수직이든 상관없어, 내가 한 일이 작동하지 않는 것뿐이야

아니요, 죄송합니다.
 
나는 사람들이 종종 후행 또는 손익분기 함수를 묻는 것을 알아차렸습니다. 여기에 가격 차트(예: MA 또는 포물선 )에 선을 그리는 함수에 전달된 일부 표시기의 값에 따라 스탑을 지정된 손익분기 수준으로 이동하고 포지션 스탑을 추적하는 스텁 함수를 추가했습니다.

#property strict // в самое начало кода вашей программы (если нету там ещё)


// Функцию - за пределы остальных функций программы
//+------------------------------------------------------------------+
//| Трейлинг по значению + перенос стопа на уровень безубытка        |
//+------------------------------------------------------------------+
void TrailingByLevel( string symbol_name,           // Имя символа
                     int magic_number,             // Magic ордера
                     double level_of_trail,         // Уровень, на который ставим стоп (например МА или Parabolic SAR)
                     int trailing_start,           // Профит в пунктах для старта трала
                     int trailing_step,             // Шаг трала в пунктах
                     int trailing_stop,             // Отступ стоплосс от уровня МА или SAR в пунктах
                     int profit_for_breakeven= 15 ,   // Профит в пунктах для переноса стопа в безубыток
                     int breakeven_level= 5 ,         // Уровень безубытка в пунктах
                     bool use_trail= true ,           // Флаг использования трала
                     bool use_breakeven= false        // Флаг использования безубытка
                     )
   {
   int lv=StopLevel(symbol_name)+ 1 ;                 // Получаем значение Stop Level по символу + 1 пункт (из отдельной функции)
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS )) {
         if ( OrderMagicNumber ()!=magic_number)   continue ;         //Если Магик не наш - идем к следующему ордеру
         if ( OrderSymbol ()!=symbol_name)         continue ;         //Если Символ не наш - идем к следующему ордеру
         //--- покупки
         if ( OrderType ()== OP_BUY ) {
             int     digits=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
             double point=( SymbolInfoDouble (symbol_name, SYMBOL_POINT ));
             double pb= SymbolInfoDouble (symbol_name, SYMBOL_BID );
             double profit=pb- OrderOpenPrice ();                     // Профит позиции в цене (без комиссий и свопов)
             //--- безубыток
             if (use_breakeven) {
               //--- если профит в цене больше заданного
               if (profit>=profit_for_breakeven*point) {
                   int err= ERR_NO_ERROR ;
                   double sl= NormalizeDouble ( OrderOpenPrice ()+breakeven_level*point,digits);
                   if (pb-lv*point>sl && OrderStopLoss ()<sl) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                   if (err== ERR_MARKET_CLOSED ) return ;
                  }
               }
             //--- трал
             if (use_trail) {
               //--- если профит в пунктах больше заданного, или изначально задан меньше ноля
               if (profit>=trailing_start*point || trailing_start== EMPTY ) {
                   int err= ERR_NO_ERROR ;
                   double sl= NormalizeDouble (level_of_trail-trailing_stop*point,digits);   // вычисляем новый уровень стоплосс по значению, переданному в функцию
                   //--- Если новое значение СЛ не ближе Stop Level и если новое положение СЛ больше старого+шаг СЛ, то модифицируем стоп позиции
                   if (pb-lv*point>sl && OrderStopLoss ()+trailing_step*point<sl) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                   if (err== ERR_MARKET_CLOSED ) return ;
                  }
               }
            }

         //--- Продажи
         if ( OrderType ()== OP_SELL ) {
             int     digits=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
             double point=( SymbolInfoDouble (symbol_name, SYMBOL_POINT ));
             double pa= SymbolInfoDouble (symbol_name, SYMBOL_ASK );
             double profit= OrderOpenPrice ()-pa;                     // Профит позиции в цене (без комиссий и свопов)
             //--- безубыток
             if (use_breakeven) {
               //--- если профит в цене больше заданного
               if (profit>=profit_for_breakeven*point) {
                   int err= ERR_NO_ERROR ;
                   double sl= NormalizeDouble ( OrderOpenPrice ()-breakeven_level*point,digits);
                   if (pa+lv*point<sl && ( OrderStopLoss ()>sl || OrderStopLoss ()== 0 )) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                   if (err== ERR_MARKET_CLOSED ) break ;
                  }
               }
             //--- трал
             if (use_trail) {
               //--- если профит в пунктах больше заданного, или изначально задан меньше ноля
               if (profit>=trailing_start*point || trailing_start== EMPTY ) {
                   int err= ERR_NO_ERROR ;
                   double sl= NormalizeDouble (level_of_trail+trailing_stop*point,digits);   // вычисляем новый уровень стоплосс по значению, переданному в функцию
                   //--- Если новое значение СЛ не ближе Stop Level и если новое положение СЛ больше старого+шаг СЛ, то модифицируем стоп позиции
                   if (pa+lv*point<sl && ( OrderStopLoss ()-trailing_step*point>sl || OrderStopLoss ()== 0 )) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                   if (err== ERR_MARKET_CLOSED ) break ;
                  }
               }
            }
         }
      }
}
//+------------------------------------------------------------------+
int StopLevel( string symbol_name) {
   int sp=( int ) SymbolInfoInteger (symbol_name, SYMBOL_SPREAD );
   int lv=( int ) SymbolInfoInteger (symbol_name, SYMBOL_TRADE_STOPS_LEVEL );
   return ((lv== 0 )?sp* 2 :lv);
   }
//+------------------------------------------------------------------+
일반적으로 무언가를 ezli - 물어보십시오. 또는 수정
 
Artyom Trishkin :
나는 사람들이 종종 후행 또는 손익분기 함수를 묻는 것을 알아차렸습니다. 여기에 가격 차트에 선을 그리는 함수(예: MA 또는 포물선)에 전달된 일부 표시기의 값에 따라 스탑을 주어진 손익분기 수준으로 이동하고 포지션 스탑을 추적하는 스텁 함수를 추가했습니다.


일반적으로 ezhli 무언가를 요청하십시오. 또는 수정
안녕하세요 Artyom, CodeBase에 배치하지 않으시겠습니까? 적어도 하나의 올바른 코드가 더 있을 것입니다.