공개 거래 확인 문제

 

안녕하세요, 이미 공개 거래가 있는지 확인 하기 위해 이것을 코드에 추가했습니다. 문제는 코드가 하나의 거래를 실행하고 그것이 전부라는 것입니다. 누구든지 이 코드의 문제를 볼 수 있습니까? 나는 프로그래밍에 대한 슈퍼 전문가가 아닙니다.


// 오픈 거래 확인

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
if(주문선택(cnt,SELECT_BY_POS))
{

if(OrderSymbol()==Symbol())
{
tradeopen=참;
}
또 다른
{
tradeopen=거짓;
}

}

}

 
귀하의 코드는 나에게 괜찮아 보이는 것 외에는 보류 중 및 미결 거래를 픽업합니다.
 

귀하의 신속한 답변에 감사드립니다 Raptor


괜찮으시다면 전체 코드를 첨부하겠습니다. 다른 곳에서 놓친 부분이 있을 수 있습니다. 나는 현재 이것으로 벽에 부딪쳤다.

파일:
daz.mq4  3 kb
 
dazamate :
누구든지 이 코드의 문제를 볼 수 있습니까?

  1. 매직 넘버가 없다는 것은 다른 모든 EA 및 수동 거래 와 호환되지 않으며 동일한 쌍/다른 시간 프레임에서 자체적으로 사용할 수 없음을 의미합니다.
  2. 첫 번째 열린 주문이 EA가 아닌 경우 플래그는 열린 거래가 있더라도 false입니다.
     int TotalOrderCount(){
         int count= 0 ;
         for (pos = OrdersTotal ()- 1 ; pos >= 0 ; pos--) if (
             OrderSelect (pos, SELECT_BY_POS)                 // Only my orders w/
        &&   OrderMagicNumber ()  == magic.number             // my magic number
        &&   OrderSymbol ()       == Symbol () ){               // and my pair.
            count++;
        }
         return (count);
    }

 
dazamate :

신속한 답변에 감사드립니다 Raptor


괜찮으시다면 전체 코드를 첨부하겠습니다. 다른 곳에서 놓친 부분이 있을 수 있습니다. 나는 현재 이것으로 벽에 부딪쳤다.

몇 가지 의견 . . .

당신은 선언 i . .

 int i;

. . . 하지만 당신은 어디에도 설정하지 않습니다, 나는 무엇입니까?

당신은 설정합니다. . .

 static bool tradeopen = false ;

. . 그런 다음 거래를 할 수 있는지 확인 하십시오. . . 이 시점에서 항상 false입니다. . . 그러면 나중에 true로 설정할 수 있는 코드가 있습니다.

 if (OrderSymbol()== Symbol ())
    {
    tradeopen=true;
    }  

barcount가 0으로 설정되었습니다.

 static int barcount = 0 ;

따라서 차트에 막대가 1개 이상 있으면 항상 사실입니다. . .

 if ( Bars != barcount)

코드를 한 줄씩 살펴봐야 합니다. . . 당신이 이해하지 못하는 것은 그것을 찾아 읽고 그것에 대해 읽으십시오. . . 그것이 당신이 배울 수 있는 유일한 방법입니다.

 

랩터, 처리해주셔서 감사합니다. 내가 말했듯이 나는 슈퍼 전문가가 아닙니다. 나는 다른 사람들이 코드를 작성하는 방식을 읽고 그것을 내 것으로 구현하려고 합니다. 기능에 대해 많이 읽었습니다. 작동하지 않고 자신의 재해를 진단하는 방법을 모를 때 답답할 뿐입니다.

귀하의 의견에 대한 답변으로

 int i;

없어졌어, 내가 실수로 거기에 남겨둔 다른 것을 위해 그것을 사용하고 있었어


나는 바 카운터와 관련하여 내 머리 속에 무슨 일이 일어나고 있는지 설명할 것입니다. 코드의 이 부분이 왜 좋지 않은지 아직 잘 모르겠습니다.

 static int barcount = 0;  // <- First time program is run bar counter is set to 0

     if ( Bars != barcount) // <- This will be true so the if statement is allowed to run
    
       {      
         if (iBarHour == iOpenHour)
                {
                //If statement
    
                }
         barcount= Bars ; // <- At the end of the if statement, the bar counter is set to Bars so that this if statement will not be true
                         //    again until another bar opens
       }

쌍에 열려 있는 거래가 있는지 확인하기 위해...

 static bool tradeopen = false ;                // First time program is run tradeopen is set to false. I use the static in front 
// because if I don't the programming will keep setting this to false because an ea or   // a program is just a giant loop is it not. However I should set this to true because // the ea should assume there is a trade open until it does it checks that would // probably be the more smarter approach.       for ( int cnt= OrdersTotal ()- 1 ;cnt>= 0 ;cnt--)         {            if ( OrderSelect (cnt,SELECT_BY_POS)) // <- So it scans each open and pending trade             {                           if ( OrderSymbol ()== Symbol ()) // <- Checks to see if any of them trades are the same as the pair the ea is using                {                 tradeopen=true; // If so then set tradeopen to true                }                        else                {                 tradeopen=false; // If not set trade open to false                }                          }                         }

따라서 ea가 끝날 때 현재 쌍에 거래가 열려 있는지 여부를 확인하기 위해 이 검사를 수행합니다. tradeopen을 true 또는 false로 설정합니다. 이 비트 오프 코드가 EA 끝에 사용되는 것이 문제입니까?

또한 내가 이해할 수없는 또 다른 문제 ...

 int iBarHour;
iBarHour = TimeHour ( TimeCurrent ());
Print (iBarHour);
iBarHour가 항상 1을 반환하는 이유는 무엇입니까? 현재 시간을 반환하고 싶습니다 :(


WHRoeder


EA가 매직 넘버를 사용하는지 여부는 중요합니까? 열려 있는 모든 거래와 보류 중인 거래를 확인하고 그 중 하나가 현재 쌍인지 확인할 수 없습니까?


다시 한 번 여러분, 저는 제가 초보자라는 것을 알고 있지만 귀하의 모든 의견에 감사드립니다. 나는 아마도 내 이상한 코딩에 대해 다시 찢어질 것이라는 것을 압니다. P


감사해요

 
dazamate :

나는 바 카운터와 관련하여 내 머리 속에 무슨 일이 일어나고 있는지 설명할 것입니다. 코드의 이 부분이 왜 좋지 않은지 아직 확실하지 않습니다.

죄송합니다. 아마도 정적 변수 사용에 대한 무지를 보여주는 것 같습니다. . . 대신 전역 변수를 사용하고 코드를 초기화할 때 설정하려는 모든 것을 init 함수에 넣습니다. https://docs.mql4.com/basis/functions/special

주말 동안 코드의 이 부분을 실행하면 변경되지 않고 서버 시간을 사용하며 각 틱마다 업데이트됩니다.

 int iBarHour;
iBarHour = TimeHour( TimeCurrent ());
Print (iBarHour);

이 코드가 작동한다고 가정하면 dDayOpenPrice는 iBarHour = 6일 때만 설정되고, iBarHour = 7일 때 dDayOpenPrice는 더 이상 올바른 값으로 설정되지 않습니다. dDayOpenPrice를 전역으로 설정하면 코드가 실행되는 동안 값이 저장됩니다(정적으로 만드는 것도 작동할 것입니다). 코드가 다시 시작되면 다음날까지 아무 일도 일어나지 않습니다. . . 오전 6시까지가 아닙니다.

WHRoeder

EA가 매직 넘버를 사용하는지 여부는 중요합니까? 열려 있는 모든 거래와 보류 중인 거래를 확인하고 그 중 하나가 현재 쌍인지 확인할 수 없습니까?

수동 거래 없이 하나의 차트에 하나의 EA만 있는 경우. . 그러면 매직 넘버를 사용하지 않고 빠져나갈 수 있을 것입니다. 하지만 그것을 사용하는 것이 좋은 습관입니다. 먼저 코드를 작동시킨 다음 매직 넘버를 구현하면 학습에 도움이 될 것입니다.

 

RaptorUK 다시 한번 감사드립니다.


코드가 작동하는지 확인하기 위해 ea를 백테스트하고 변수를 Print()하여 코드 디버그에 도움이 되는 내용을 확인합니다. ibarhour 코드가 제대로 작동하는 것 같습니다. ibarhour의 값을 지속적으로 인쇄하도록 설정했기 때문에 백테스트에서 제대로 표시되지 않았습니다. 인쇄 코드를 지연시킬 수 있는 방법이 있습니까?



또한 예 06:00 바의 오픈 값을 저장하고 싶습니다 :)


나는 코드를 재구성했고, ea가 현재 쌍에서 거래를 열었는지 확인할 수 있다는 사실이 자랑스럽습니다. WHRoeder 예제를 사용 하여 별도의 함수로 변환했습니다. :) 그리고 true 또는 false를 반환하는 함수를 얻었습니다. 야.



당신은 분명히 EA 코딩 분야의 엘리트이기 때문입니다. 자신의 EA를 만드는 사람들로부터 얼마나 많은 성공 사례를 들었습니까? 나는 단지 나쁜 이야기를 듣거나 보았다.











 
dazamate :

당신은 분명히 EA 코딩 분야의 엘리트이기 때문입니다. 자신의 EA를 만드는 사람들로부터 얼마나 많은 성공 사례를 들었습니까? 나는 단지 나쁜 이야기를 듣거나 보았다.











ㅋㅋㅋ . . . 귀하의 의견은 제가 아니라 WHRoeder 를 대상으로 해야 합니다 . 그는 저보다 훨씬 더 능숙한 코더입니다. 그가 공유한 코드에서 그의 최근 게시물을 살펴보고 그의 코드를 이해함으로써 많은 것을 배울 수 있습니다. WHRoeder 감사 합니다 :-) .

나는 사람들이 스스로 도울 수 있도록 돕고 싶기 때문에 여기에 어울리고 있습니다. . . 그리고 그 과정에서 무언가를 배우게 됩니다.

성공적인 EA를 가지려면 먼저 성공적인 방법이 필요합니다. . . 그 중 몇 개가 있습니까? 많은 것들이 단기간에 효과가 있고 몇 가지 작업은 한 두 달 동안 효과가 있으며 매우 소수만이 지속적으로 작동합니다. 누군가가 좋은 방법을 가지고 있다 하더라도(적절한 테스트 없이 이것을 어떻게 알 수 있을지는 모르겠지만) 일반적으로 그것을 실행 가능한 EA로 전환할 지식이나 능력이 없습니다. 실행 가능한 EA가 있는 사람은 사실을 광고할 가능성이 거의 없으며 이를 사용하여 돈을 벌 것입니다. . .

당신이 발전하고 있다는 소식을 들으니 기쁩니다. . . 인쇄 문제와 관련하여 주석 ( iBarHour )을 사용할 수 있습니다. 대신 왼쪽 상단 모서리에 있는 화면으로 출력됩니다.

 
  1. 천만에요. "무언가를 배우려면 연습하고 마스터하려면 가르쳐라."
  2. 막대는 신뢰할 수 없습니다(차트의 최대 막대에 도달하면 변경되지 않고 코드가 중단됩니다.) 틱을 놓치면 코드가 중단되는 경우 Volume[0]==1은 신뢰할 수 없습니다. 항상 시간을 사용하십시오.
     int start(){
       static datetime Time0;
       if (Time0 == Time[ 0 ]) return ; Time0 = Time[ 0 ];
       // A new bar has started.

  3. 아마도 정적 변수의 사용에 대한 나의 무지를 보여주는 것 같습니다. . . 대신 전역 변수를 사용하고 코드 초기화 시 설정하려는 모든 것을 사용합니다.
    변수를 초기화해야 하는 경우 전역이어야 합니다. 변수가 두 개 이상의 함수 간에 공유되는 경우 전역 변수여야 합니다. 그렇지 않으면 함수에 대해 로컬로 정의하고 필요한 경우 정적으로 정의합니다.
  4. EA가 매직 넘버를 사용하는지 여부는 중요합니까?
    아마도 모든 것이 작동하고 있을 것입니다. 그런 다음 거기에서 테스트하기 위해 다른 차트를 열고 갑자기 모든 것이 실패합니다. 처음부터 제대로 하세요. 내 코드 에서는 다른 차트에 올려놓고 매직 넘버를 변경하지 않는 경우를 대비하여 매직 넘버와 페어를 모두 확인합니다.
 

당신의 권리 랩터 ... 무례한 WHRoeder는 잘 감사하지 않습니다 죄송합니다. 글쎄, 이것은 나를 위한 거대한 프로젝트의 시작이므로 너희들이 내가 당신을 괴롭히는 것을 신경쓰지 않기를 정말로 바랍니다.


 int start(){
   static datetime Time0;
   if (Time0 == Time[ 0 ]) return ; Time0 = Time[ 0 ];
   // A new bar has started.

WHRoeder, 이 코드는 매우 간단해 보이지만 어떻게 작동하는지 머리로는 이해할 수 없습니다. time0이 time[0]과 같을 때마다 time0을 time[0]과 같게 하면 if 문은 항상 참이 되지 않을까요? 작동하지 않는다고 말하는 것은 아니지만 어떻게 작동하는지 이해하지 못합니다.


질문이 2개 더 있습니다.

보류 중인 주문 이 있고 x 양의 막대로 트리거되지 않으면 취소되는 카운터를 만드는 방법은 무엇입니까? 내가 생각해낼 수 있는 것은 새 막대가 형성될 때마다 계산하는 카운터를 놓고 계산된 막대의 양 == 보류 중인 주문이 취소되기 전에 지정된 허용 막대를 계산하는 것입니다. 새로운 보류 주문이 열릴 때마다 바 카운터가 재설정됩니까? 어떻게 들리나요?

다음 질문.

이것은 어떻게 해야할지 전혀 모릅니다.

1시간 tf에 eurusd, usdchf, gbpusd, usdjpy를 스캔하는 함수를 만들고 싶습니다. 마지막 06:00 gmt 양초로 돌아가서 시가를 기록하고 이전 06:00 gmt 양초 기록으로 돌아가서 각 쌍에 대해 6gmt -6gmt 범위를 기록합니다. 그런 다음 모든 쌍의 6gmt - 6gmt 범위를 비교하고 가장 높은 값을 반환합니다. ea가 1번 타임차트에 붙은걸로 가능한가요?


지식인과 환자분들께 다시 한 번 감사드립니다.