전문가를 위한 질문

 

안녕하세요. 프로그래머님들 도와주세요.

전문가: 과매도 영역(25 미만)의 스토캐스틱 및 신호의 바이-크로스오버 및 다음을 제공합니다.

Pivot은 가격 수준보다 낮습니다(일종의 지원). 판매는 정반대이며 Pivot은 가격 수준보다 높습니다.

테스트 결과 프로그래밍 결함이 나타났습니다. 1) 신호당 하나의 거래만 열리도록 하는 방법(테스트 과정에서 신호가 여전히 유효(거짓)이고 포지션을 청산할 조건이 이미 왔을 때 모든 것이 누출되었습니다). 2) Pivot이 가격 수준 위/아래라는 조건을 올바르게 설정했는지 여부. 테스트 일정을 보면서 의문이 생겼습니다.

Misters 프로그래머는 가능한 경우 구체적인 예를 들어 도움을 줍니다. 그리고 간단한 컴파일 수준의 프로그래밍을 알고 있습니다 !!!!!

extern 이중 랏 = 0.1;

//+----------------------------------------------- --------------------+
//| |
//+----------------------------------------------- --------------------+
정수 시작()
{
더블 P_up0,P_down0,P_up1,P_down1;
이중 st_m1, st_s1, st_m2, st_s2, 피벗, ma_s1;
int cnt, 티켓, 합계;

if(막대<100)
{
Print("100개 미만의 막대");
리턴(0);
}
P_up0=iCustom(0,0,"가격 채널",11,0,0);
P_down0=iCustom(0,0,"가격 채널",11,1,0);
P_up1=iCustom(0,0,"가격 채널",11,0,1);
P_down1=iCustom(0,0,"가격 채널",11,1,1);
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2);
피벗=iCustom(0,0,"피벗",0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//모든 데이터 설정

총계=주문총계();
if(총<1)
{
// 여유 여백 확인
if(AccountFreeMargin()<(1000*Lots))
{
Print("돈이 없습니다. Free Margin = ", AccountFreeMargin());
리턴(0);
}
// BUY 포지션을 열기 위한 조건
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);
if(티켓>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("구매 주문이 열렸습니다: ",OrderOpenPrice());
}
else Print("구매 주문 열기 오류: ",GetLastError());
리턴(0);
}
// SELL 포지션을 열기 위한 조건
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
if(티켓>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print(" SELL 주문 이 열렸습니다 : ",OrderOpenPrice());
}
else Print("판매 주문 열기 오류: ",GetLastError());
리턴(0);
}
리턴(0);
}
for(cnt=0;cnt<전체;cnt++)
{
주문 선택(cnt, SELECT_BY_POS, MODE_TRADES);
if(주문유형()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // 롱 포지션 오픈
{
// 롱 포지션 청산 조건
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(), 입찰, 3, 보라색);
리턴(0);
}
}
또 다른
{
// 숏 포지션 청산 조건
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,바이올렛);
리턴(0);
}
}
}
}
반환(0);
}




파일:
pivot.mq4  2 kb
 
Kostay :

안녕하세요. 프로그래머님들 도와주세요.

전문가: 과매도 영역(25 미만)의 스토캐스틱 및 신호의 바이-크로스오버 및 다음을 제공합니다.

Pivot은 가격 수준보다 낮습니다(일종의 지원). 판매는 정반대이며 Pivot은 가격 수준보다 높습니다.

테스트 결과 프로그래밍 결함이 나타났습니다. 1) 신호당 하나의 거래만 열리도록 하는 방법(테스트 과정에서 신호가 여전히 유효(거짓)이고 포지션을 청산할 조건이 이미 왔을 때 모든 것이 누출되었습니다). 2) Pivot이 가격 수준 위/아래라는 조건을 올바르게 설정했는지 여부. 테스트 일정을 보면서 의문이 생겼습니다.

Misters 프로그래머는 가능한 경우 구체적인 예를 들어 도움을 줍니다. 그리고 간단한 컴파일 수준의 프로그래밍을 알고 있습니다 !!!!!

extern 이중 랏 = 0.1;

//+----------------------------------------------- --------------------+
//| |
//+----------------------------------------------- --------------------+
정수 시작()
{
더블 P_up0,P_down0,P_up1,P_down1;
이중 st_m1, st_s1, st_m2, st_s2, 피벗, ma_s1;
int cnt, 티켓, 합계;

if(막대<100)
{
Print("100개 미만의 막대");
리턴(0);
}
P_up0=iCustom(0,0,"가격 채널",11,0,0);
P_down0=iCustom(0,0,"가격 채널",11,1,0);
P_up1=iCustom(0,0,"가격 채널",11,0,1);
P_down1=iCustom(0,0,"가격 채널",11,1,1);
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2);
피벗=iCustom(0,0,"피벗",0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//모든 데이터 설정

총계=주문총계();
if(총<1)
{
// 여유 여백 확인
if(AccountFreeMargin()<(1000*Lots))
{
Print("돈이 없습니다. Free Margin = ", AccountFreeMargin());
리턴(0);
}
// BUY 포지션을 열기 위한 조건
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);
if(티켓>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("구매 주문이 열렸습니다: ",OrderOpenPrice());
}
else Print("구매 주문 열기 오류: ",GetLastError());
리턴(0);
}
// SELL 포지션을 열기 위한 조건
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
if(티켓>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("판매 주문이 열렸습니다: ",OrderOpenPrice());
}
else Print("판매 주문 열기 오류: ",GetLastError());
리턴(0);
}
리턴(0);
}
for(cnt=0;cnt<전체;cnt++)
{
주문 선택(cnt, SELECT_BY_POS, MODE_TRADES);
if(주문유형()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // 롱 포지션 오픈
{
// 롱 포지션 청산 조건
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(), 입찰, 3, 보라색);
리턴(0);
}
}
또 다른
{
// 숏 포지션 청산 조건
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,바이올렛);
리턴(0);
}
}
}
}
반환(0);
}

1) 신호당 하나의 거래만 열리게 하는 방법

다음과 같이 필요합니다.

 if ( total < 1 ) 
     {
       if ( AccountFreeMargin () < ( 1000 * Lots ))
         {
         Print ( " We have no money. Free Margin = " , AccountFreeMargin ()) ;
         return ( 0 ) ;  
         }
         

if ( st_m2 > st_s2 && st_m1 > st_s1 && st_m2 < 25 && Pivot < ma_s1 )
{

         ticket = OrderSend ( Symbol () , OP_BUY , Lots , Ask , 3 , 0 , 0 , "" , 0 , 0 , Green ) ;

         if ( ticket > 0 )
           {
             if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ))
               Alert ( " Покупка: " , OrderOpenPrice ()) ;                      
           }
         else Alert ( " ошибка:по цене " , OrderOpenPrice ()) ; 
         return ( 0 ) ; 
         }
        
        
     return ( 0 ) ;
     }
 
같은 자리에서 보증금 전액을 잃어버렸습니다!
 

나는 아직도 이 코드가 무엇을 변경했는지 이해하지 못한다. 모든 것이 같은 것 같습니까?

그러나 신호당 하나의 위치만 열도록 프로그래밍하려면 어떻게 해야 합니까?

동일한 막대의 위치가 닫힌 경우(즉, 신호가 여전히 유효한 경우) 새 위치가 열리지 않아야 합니다.

 
Kostay :

...하지만 신호당 하나의 위치만 열도록 프로그래밍하는 방법은 무엇입니까?

동일한 막대의 위치가 닫힌 경우(즉, 신호가 여전히 유효한 경우) 새 위치가 열리지 않아야 합니다.

닫힌 시간을 포함 하여 주문 시작 시간 이 신호가 나타난 현재 막대에 속하면 울타리에서 담배를 피웁니다.

다음과 같이 다소:

 bool flag = true ;
int cnt = OrdersTotal () - 1 ;
for ( int i = cnt ; i >= 0 ; i -- ) {
   if ( ! OrderSelect ( i , SELECT_BY_POS , MODE_TRADES )) continue ;
   if ( OrderOpenTime () >= Time [ 0 ]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
       flag = false ;
       break ;
   }
}
cnt = OrdersHistoryTotal () - 1 ;
for ( i = cnt ; i >= 0 ; i -- ) {
   if ( ! OrderSelect ( i , SELECT_BY_POS , MODE_HISTORY )) continue ;
   if ( OrderOpenTime () >= Time [ 0 ]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
       flag = false ;
       break ;
   }
}
if ( ! flag ) return ; 
 

이것이 존재하는 경우 어떻게 1개 이상의 포지션을 동시에 열 수 있습니까?

total= OrdersTotal ();
if(total<1)

?
 

어드바이저에 코드를 붙여넣었습니다. 그러나 결과는 동일합니다.

캐드를 잘못넣었나보네요. 봐주세요.

extern 이중 랏 = 0.1;
부울 플래그 = true;
//+----------------------------------------------- --------------------+
//| |
//+----------------------------------------------- --------------------+
정수 시작()
{
더블 P_up0,P_down0,P_up1,P_down1;
이중 st_m1, st_s1, st_m2, st_s2, 피벗, ma_s1;
int cnt, 티켓, 합계;

if(막대<100)
{
Print("100개 미만의 막대");
리턴(0);
}
P_up0=iCustom(0,0,"가격 채널",11,0,0);
P_down0=iCustom(0,0,"가격 채널",11,1,0);
P_up1=iCustom(0,0,"가격 채널",11,0,1);
P_down1=iCustom(0,0,"가격 채널",11,1,1);
st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2);
피벗=iCustom(0,0,"피벗",0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//모든 데이터 설정

총계=주문총계();
if(총<1)
{
// 여유 여백 확인
if(AccountFreeMargin()<(1000*Lots))
{
Print("돈이 없습니다. Free Margin = ", AccountFreeMargin());
리턴(0);
}
// BUY 포지션 을 열기 위한 조건
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);

if(티켓>0)
{
if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))
Alert("구매: ",OrderOpenPrice());
}
else Alert("오류:가격 ",OrderOpenPrice());
리턴(0);
}
int cn=OrdersTotal()-1;
for(int i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 계속;
if(OrderOpenTime()>=Time[0]) { // Time[0] - 현재 심볼의 제로 바에서 포지션이 열린 경우
플래그=거짓;
부서지다;
}
}
cnt=OrdersHistoryTotal()-1;
for(i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) 계속합니다.
if(OrderOpenTime()>=Time[0]) { // Time[0] - 현재 심볼의 제로 바에서 포지션이 열린 경우
플래그=거짓;
부서지다;
}
}
if(! 플래그) 반환;
// SELL 포지션을 열기 위한 조건
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
if(티켓>0)
{
if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))
Alert("구매: ",OrderOpenPrice());
}
else Alert("오류:가격 ",OrderOpenPrice());
반환(0);
}
int c=OrdersTotal()-1;
for(int a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 계속;
if(OrderOpenTime()>=Time[0]) { // Time[0] - 현재 심볼의 제로 바에서 포지션이 열린 경우
플래그=거짓;
부서지다;
}
}
cnt=OrdersHistoryTotal()-1;
for(a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) 계속합니다.
if(OrderOpenTime()>=Time[0]) { // Time[0] - 현재 심볼의 제로 바에서 포지션이 열린 경우
플래그=거짓;
부서지다;
}
}
if(! 플래그) 반환;
리턴(0);
}
for(cnt=0;cnt<전체;cnt++)
{
주문 선택(cnt, SELECT_BY_POS, MODE_TRADES);
if(주문유형()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // 롱 포지션 오픈
{
// 롱 포지션 청산 조건
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(), 입찰, 3, 보라색);
리턴(0);
}
}
또 다른
{
// 숏 포지션 청산 조건
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,바이올렛);
반환(0);
}
}
}
}
반환(0);
}




 
D500_Rised :

이것이 존재하는 경우 어떻게 1개 이상의 포지션을 동시에 열 수 있습니까?

total= OrdersTotal ();
if(total<1)

?

당신은 오해했다. 1개 이상의 포지션은 동시에 열리지 않습니다!!!!! 신호가 나타났습니다 - 위치가 열렸습니다. 동일한 제로 바에서 가격은 반대 방향으로 가고 포지션을 청산하는 조건은 유효합니다. 따라서 동일한 제로 바에서 닫힙니다. 그러나 아무도 신호 조치를 취소하지 않았습니다. 반대 방향으로 갈 때 새로운 위치가 열리고 다시 닫힙니다.

따라서 문제는 새 틱으로 마감하더라도 하나의 신호에서 하나의 포지션만 열리게 하는 방법입니다!!!??

 
그런 다음 인트라 바 거래를 금지 하고 이러한 키워드로 검색하면 찾을 수 있습니다.
 
Kostay :

어드바이저에 코드를 붙여넣었습니다. 그러나 결과는 동일합니다.

캐드를 잘못넣었나보네요. 봐주세요.

다음 번에만 버튼을 통해 코드를 붙여넣으 세요.

오류가 없어야 하는데 확인을 하지 않았습니다.

 extern double Lots = 0.1 ;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start () {
   double P_up0 , P_down0 , P_up1 , P_down1 ;
   double st_m1 , st_s1 , st_m2 , st_s2 , Pivot , ma_s1 ;
   int i , cnt , ticket , total ;
   bool flag = true ;

   if ( Bars < 100 ) {
       Print ( " bars less than 100 " ) ;
       return ( 0 ) ; 
   }
// Проверяем стоит ли открываться
   
   cnt = OrdersHistoryTotal () - 1 ;
   for ( i = cnt ; i >= 0 ; i -- ) {
       if ( ! OrderSelect ( i , SELECT_BY_POS , MODE_HISTORY )) continue ;
       if ( OrderOpenTime () >= Time [ 0 ]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag = false ;
         break ;
       }
   }
   cnt = OrdersTotal () - 1 ;
   for ( i = cnt ; i >= 0 ; i -- ) {
       if ( ! OrderSelect ( i , SELECT_BY_POS , MODE_TRADES )) continue ;
       if ( OrderOpenTime () >= Time [ 0 ]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag = false ;
         break ;
       }
   }
   if ( ! flag ) return ( 0 ) ; 
//-----------------------------------------------
   P_up0 = iCustom ( 0 , 0 , " Ценовой канал " , 11 , 0 , 0 ) ;
   P_down0 = iCustom ( 0 , 0 , " Ценовой канал " , 11 , 1 , 0 ) ;
   P_up1 = iCustom ( 0 , 0 , " Ценовой канал " , 11 , 0 , 1 ) ;
   P_down1 = iCustom ( 0 , 0 , " Ценовой канал " , 11 , 1 , 1 ) ;
   st_m1 = iStochastic ( 0 , 0 , 10 , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 1 ) ;
   st_s1 = iStochastic ( 0 , 0 , 10 , 3 , 3 , MODE_SMA , 0 , MODE_SIGNAL , 1 ) ;
   st_m2 = iStochastic ( 0 , 0 , 10 , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 2 ) ;
   st_s2 = iStochastic ( 0 , 0 , 10 , 3 , 3 , MODE_SMA , 0 , MODE_SIGNAL , 2 ) ;
   Pivot = iCustom ( 0 , 0 , " Pivot " , 0 , 1 ) ;
   ma_s1 = iMA ( 0 , 0 , 4 , 0 , MODE_SMA , PRICE_CLOSE , 1 ) ;
//задали все данные 

// Проверка свободной маржи
   if ( AccountFreeMargin () < ( 1000 * Lots )) {
       Print ( " We have no money. Free Margin = " , AccountFreeMargin ()) ;
       return ( 0 ) ; 
   }
      
// Условие открытие позиции BUY
   if ( st_m2 > st_s2 && st_m1 > st_s1 && st_m2 < 25 && Pivot < ma_s1 ) {
       ticket = OrderSend ( Symbol () , OP_BUY , Lots , Ask , 3 , 0 , 0 , "" , 0 , 0 , Green ) ;
       if ( ticket > 0 ) {
         if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ))
             Alert ( " Покупка: " , OrderOpenPrice ()) ; 
       }    else Alert ( " ошибка:по цене " , OrderOpenPrice ()) ; 
       return ( 0 ) ; 
   }
      
// Условие открытие позиции SELL
   if ( st_m2 < st_s2 && st_m1 < st_s1 && st_m2 > 75 && Pivot > ma_s1 ) {
       ticket = OrderSend ( Symbol () , OP_SELL , Lots , Bid , 3 , 0 , 0 , "" , 0 , 0 , Red ) ;
       if ( ticket > 0 ) {
         if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ))
             Alert ( " Покупка: " , OrderOpenPrice ()) ; 
       }    else Alert ( " ошибка:по цене " , OrderOpenPrice ()) ; 
       return ( 0 ) ; 
   }
  
   for ( i = cnt ; i >= 0 ; i -- ) {
       OrderSelect ( cnt , SELECT_BY_POS , MODE_TRADES ) ;
       if ( OrderType () <= OP_SELL && OrderSymbol () == Symbol ()) {
         if ( OrderType () == OP_BUY ) { // длинная позиция открыта
// условие закрытие длинной позиции
             if ( P_down1 > P_down0 ) {
               OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Violet ) ; 
               return ( 0 ) ; 
             }
         }    else {
// условие закрытия короткой позиции
               if ( P_up1 < P_up0 ) {
                   OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Violet ) ; 
                   return ( 0 ) ; 
               }
             }
       }
   }
   return ( 0 ) ;
}
 

지금 고문에게 이상한 일이 일어나고 있습니다. 약속 된 포지션 청산은 작동하지 않습니다. 동일한 유형의 여러 위치를 열고 동시에 작동할 수 있습니다. 그리고 결과: 수정된 버전이지만 모든 것이 동일한 문제에 병합됩니다!!??