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

 
sss2019 :

그러나 이 조건에 대해 Expert Advisor를 작성하는 것이 더 합리적인 방법을 알려주십시오.

고문이 거래를 시작하는 세 가지 통화 쌍이 있으며 동시에 고문은 하나의 차트에만 연결되고 다른 두 개에서는 자체적으로 일반적으로 다중 통화로 작동합니다.

두 번째 조건은 가격이 모든 통화 쌍에 대해 특정 수준에 도달하면 거래가 열리는 것입니다. 한 번에 하나의 거래만 열 수 있습니다.

거래가 종료되자마자 EA는 가격에 접근한 경우 쌍 중 하나에 대해 거래를 재개할 수 있습니다.

저는 이렇게 했습니다. 변수 값이 false인 동안 정적 변수를 설정했습니다. 거래 시작이 허용되고, 쌍 중 하나에 대한 주문이 열리자 마자 변수는 값을 true로 취합니다. 그리고 거래가 종료되고 for 루프가 둘 이상의 거래를 찾을 수 없는 즉시 변수는 다시 false 값을 취합니다.

예를 들어 각 쌍에 대해 하나의 거래만 열려야 하는 경우 각 쌍에는 고유한 변수가 있어야 합니다.

이 문제에 대한 더 합리적인 해결책이 있습니까?


이를 위해 주문에는 "Magic"과 같은 매개변수가 있습니다. 특정 마법으로 주문을 계산하고 거래를 허용하거나 금지하면 됩니다.
 

주문을 올바르게 마감하는 방법은 무엇입니까? 그리고 그들에 대한 정보를 수집하는 방법?

물론 어리석은 질문에 대해 미리 사과드립니다) 여기에 다음 텍스트를 썼습니다. 알고리즘: 시가가 업 프랙탈 아래에 있고 업 프랙탈 위에 닫힐 때 매수 포지션을 열고 , 양초가 다운 프랙탈 위에서 열리고 아래에서 닫힐 때 매도 포지션을 만들고 싶습니다. 그리고 모든 포지션을 마감하기 위한 한 가지 조건이 더 있습니다. 85포인트 마이너스가 되거나 38개의 캔들 동안 주문이 열린 경우(const. S) 여기에 쓴 것 같습니다. 하지만 테스트를 할 때 일종의 와일드 그리드가 열리고 닫힙니다. 주문) 즉, 아무것도 안 닫히는 느낌이 있고, 주문은 그냥 스탬프만 찍혀있고, 대체적으로 뭔가 주문을 잘못 처리하는 느낌이 들고, 엉뚱한 방식으로 작동하고, 결과적으로 닫지 않습니다)) 클로저가 건너 뛰지 않도록 올바르게 닫는 방법을 알려주십시오. 이 코드의 오류는 어디에 있습니까? 예를 들어 이러한 모든 작업이 적절하게 수행되는 프로그램의 스레드일 수 있습니다. 미리 감사드립니다!!)


extern int S=38; // 이후에 포지션이 마감될 캔들 수
extern int SL=85;//중지, 이 위치에서 어쨌든 닫힙니다.
외부 정수 HIGH=0; //극한값을 검색하는 데 사용할 시간 프레임(5 또는 1 또는 0(D1))
외부 intl=1; // 거래할 랏 수
int 대량 주문[30][30]; //여기에 OPEN 랏에 대한 데이터가 있습니다.
정수 = 1; // 배열에 있는 요소의 번호입니다. 오픈 로트
정수 i=0;
정수 티켓 = 0;
정수=0;
더블 다운, 업=0;
이중 highH1,lowH1=0;

정수 시작()

{
if(시()>x)
{
검색H1();
위로 = highH1;
아래 = lowH1;
나는 ++;
}
//----
if(Open[1]<up && Close[1]>up)//상향 프랙탈 수준보다 양초가 열리면 낮고 닫으면 높으면
{
ticket=OrderSend(Symbol(),OP_BUY,l,Bid,5,Bid-SL*Point,NULL);
나는 = 0;
데이터를 저장();
}
if(Open[1]>down && Close[1]<down)//하향 프랙탈 수준보다 양초가 열리면 높고 닫으면 낮으면,
{
ticket=OrderSend(Symbol(),OP_SELL,l,Ask,5,Ask+SL*Point,NULL);
나는 = 0;
데이터를 저장();
}
if(i==S)
{
닫기Allticket();
닫기AllPos();
}
나는 ++;
//----
x=시();
if(시()==23)
x=-1;
리턴(0);
}
//+----------------------------------------------- --------------------+
무효 closeAllticket()
{
for(int j=0;j<=numb;j++)
{
OrderClose(massorder[j][0],l,Ask,5);
주문 닫기(대량 주문[j][0],l,입찰가,5);
}
마비=0;
}
무효 closeAllPos()
{

for(int j=0;j<=OrdersTotal();j++)
{
주문 선택(j,SELECT_BY_POS);
OrderClose(OrderTicket(),l,Ask,5);
OrderClose(OrderTicket(),l,Bid,5);
}
}
void searchH1()//프랙탈 검색 기능
{
if(iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,1) && iHigh(기호() ),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,4) && iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,5))
highH1=iHigh(Symbol(),PERIOD_H1,3);

if(iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,1) && iHigh(기호() ),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,4) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,5))
lowH1=iHigh(Symbol(),PERIOD_H1,3);
리턴(0);

}

void savedata() //데이터 배열에 저장할 프로그램
{

주문선택(티켓,SELECT_BY_TICKET);
대량주문[numb][0]=OrderTicket();
대량주문[numb][1]=주문열기가격();
대량주문[numb][2]=OrderStopLoss();
대량주문[numb][3]=OrderTakeProfit();
if(주문유형()==OP_BUY)
대량 주문[num][4]=0;
if(주문 유형()==OP_SELL)
대량주문[numb][4]=1;
마비++;

}
 
Qwertee :

주문을 올바르게 마감하는 방법은 무엇입니까? 그리고 그들에 대한 정보를 수집하는 방법?

물론 어리석은 질문에 대해 미리 사과드립니다) 여기에 다음 텍스트를 썼습니다. 알고리즘: 시가가 업 프랙탈 아래에 있고 업 프랙탈 위에 닫힐 때 매수 포지션을 열고, 양초가 다운 프랙탈 위에서 열리고 아래에서 닫힐 때 매도 포지션을 만들고 싶습니다. 그리고 모든 포지션을 마감하기 위한 한 가지 조건이 더 있습니다. 85포인트 마이너스가 되거나 38개의 캔들 동안 주문이 열린 경우(const. S) 여기에 쓴 것 같습니다. 하지만 테스트를 할 때 일종의 와일드 그리드가 열리고 닫힙니다. 주문) 즉, 아무것도 안 닫히는 느낌이 있고, 주문은 그냥 스탬프만 찍혀있고, 대체적으로 뭔가 주문을 잘못 처리하는 느낌이 들고, 엉뚱한 방식으로 작동하고, 결과적으로 닫지 않습니다)) 클로저가 건너 뛰지 않도록 올바르게 닫는 방법을 알려주십시오. 이 코드의 오류는 어디에 있습니까? 글쎄, 또는 예를 들어 이러한 모든 작업이 적절하게 수행되는 프로그램의 스레드일 수 있습니다. 미리 감사드립니다!!)


전역 변경 에서 중지의 맨 처음에 표시한 곳

 extern int MagicNumber = 11113;
int cntBuy = 0 , cntSell = 0 , totalBuy, totalSell;

주문을 열기 전에:

           totalBuy = CountTradesBuy();
           totalSell = CountTradesSell();

오프닝 시그널에서

 if ((Open[ 1 ]<up) && (Close[ 1 ]>up) && (totalBuy < 1 ) && (totalSell < 1 ))

if ((Open[ 1 ]>down) && (Close[ 1 ]<down) && (totalBuy < 1 ) && (totalSell < 1 ))

조언자 끝까지

 int CountTradesBuy() {
   int countBuy = 0 ;
   for ( int tradeBuy = OrdersTotal () - 1 ; tradeBuy >= 0 ; tradeBuy--) {
       OrderSelect (tradeBuy, SELECT_BY_POS, MODE_TRADES);
       if ( OrderSymbol () != Symbol () || OrderMagicNumber () != MagicNumber) continue ;
       if ( OrderSymbol () == Symbol () && OrderMagicNumber () == MagicNumber)
         if ( OrderType () == OP_BUY) countBuy++;
   }
   return (countBuy);
}

int CountTradesSell() {
   int countSell = 0 ;
   for ( int tradeSell = OrdersTotal () - 1 ; tradeSell >= 0 ; tradeSell--) {
       OrderSelect (tradeSell, SELECT_BY_POS, MODE_TRADES);
       if ( OrderSymbol () != Symbol () || OrderMagicNumber () != MagicNumber) continue ;
       if ( OrderSymbol () == Symbol () && OrderMagicNumber () == MagicNumber)
         if ( OrderType () == OP_SELL) countSell++;
   }
   return (countSell);
}

아무것도 잊지 않았다

 
belck :


중지의 맨 처음에 표시한 전역 변경 사항에서

주문을 열기 전에:

오프닝 시그널에서

조언자 끝까지

아무것도 잊지마



나는 당신이 쓴 모든 것을 삽입했지만 그럼에도 불구하고 어떤 이유로 든 변한 것은 없습니다. 일반적으로 결과는 그대로였고, 여전히 유지되었습니다. 많은 시간 동안 주문이 열려 있고 S 막대 이후에 닫을 필요가 있습니다. 문제가 무엇입니까???????? ?????????

파일:
ikdgna.mq4  7 kb
 
Qwertee :


나는 당신이 쓴 모든 것을 삽입했지만 그럼에도 불구하고 어떤 이유로 든 변한 것은 없습니다. 일반적으로 결과는 그대로였고 여전히 그대로 유지되었습니다. 주문은 많은 시간 동안 열려 있고 S 막대 이후에 닫을 필요가 있습니다. 문제가 무엇입니까???????? ?????????

통화 마감 주문은 주문을 열기 전에 설정해야 합니다. 나는 이것들 중 일부를 닫았습니다. 유용할 수 있음:

가장 글로벌하기 전에

 #include <stdlib.mqh>


주문을 열기 전에 다음과 같이 전화하십시오.

 if ()
   {
    CloseAllBuy();
    }
    
       
   if () 
   {
   CloseAllSell();
   }

или

if ()
   {
    CloseAllBuy();
    CloseAllSell();
     }

그리고 이것은 고문의 맨 끝에 있습니다.

 void CloseAllBuy()
{
         int i;
         int Orders = OrdersTotal ();
         bool result;
         datetime begin;
        
         if (Orders > 0 )
        {
                 for (i = Orders- 1 ; i >= 0 ; i--)
                {
                         if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                 if ( OrderSymbol () == Symbol () && OrderType () == OP_BUY && OrderMagicNumber () == MagicNumber)
                                {
                                         RefreshRates ();
                                        begin = TimeCurrent ();
                    result = OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble (Bid, Digits ), slip, Yellow ); // закрываем все встречные ордера
                                         while (!result && TimeCurrent () - begin <= 60 && ! IsTesting ())
                                        {
                                                 Sleep ( 100 );
                                                 RefreshRates ();
                    result = OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble (Bid, Digits ), slip, Yellow ); //закрываем все встречные ордера
                                        }
                                         if (!result)
                                        {
                                                 int error = GetLastError ();
                                                 Print ( "Ошибка закрытия ордера BUY #" + OrderTicket () + " " + ErrorDescription(error));
                                        }
                                }
                        }
                         else
                        {
                                 Print ( "Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

void CloseAllSell()
{
         int i;
         int orders = OrdersTotal ();
         bool result;
         datetime begin;
        
         if (orders > 0 )
        {
                 for (i = orders- 1 ; i >= 0 ; i--)
                {
                         if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                 if ( OrderSymbol () == Symbol () && OrderType () == OP_SELL && OrderMagicNumber () == MagicNumber)
                                {
                                         RefreshRates ();
                                        begin = TimeCurrent ();
                    result = OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble (Ask, Digits ), slip, Yellow ); // закрываем все встречные ордера
                                         while (!result && TimeCurrent () - begin <= 120 && ! IsTesting ())
                                        {
                                                 Sleep ( 100 );
                                                 RefreshRates ();
                   result = OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble (Ask, Digits ), slip, Yellow ); //закрываем все встречные ордера
                                        }
                                         if (!result)
                                        {
                                                 int error = GetLastError ();
                                                 Print ( "Ошибка закрытия ордера SELL #" + OrderTicket () + " " + ErrorDescription(error));
                                        }
                                }
                        }
                         else
                        {
                                 Print ( "Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

 

감정가를 위한 질문입니다. 테스트 기간 동안 최소 로트 수와 같은 어드바이저 기준이 있나요? 손해율 등?

단 2명의 어드바이저가 1년에 100번의 거래를 하고 나머지 30번은 일반적으로...(각각 15번, 30번). 수익성은 좋습니다. 실제 견적에 대한 데모의 첫 번째 것은 이제 테스트할 가치가 있습니다. 하지만 MT4보다 더 나은 테스트가 있다고 말할 수 있는 사람이 있습니까?

 
조건을 충족하는 방법을 알려주십시오. 가격이 1.2550에 도달하는 즉시 현재 가격으로 매수 주문을 여는 조건이 있습니다. 가격이 1.2550 이상이면 주문이 열리고 주문이 열리면 정적 변수 가 주문이 0이 될 때까지 새 주문의 시작을 차단하는 것으로 나타났습니다. 주문이 닫히고 이 마법으로 더 이상 주문이 없으면 개봉 금지가 해제되고 새 주문이 즉시 열리지만 가격은 이 하락을 떠난 지 오래입니다. 가격이 해당 수준에 도달하면 어드바이저가 시장 주문을 시작해야 하며 보류 중인 주문은 아닙니다.
 

모든 전문가 여러분 안녕하세요)))

마지막 두 프랙탈을 기반으로 추세선을 그리는 그런 칠면조가 있지만 그는 "확인되지 않은 프랙탈", 즉 두 번째 막대는 프랙탈 이후에 아직 형성되지 않았고 선이 이미 그려졌습니다. 첫 번째 막대가 아닌 두 번째 막대 뒤에 그리는 방법은 무엇입니까? 탭의 터키.

파일:
 
rigc :

모든 전문가에게 안녕하세요)))

마지막 두 프랙탈을 기반으로 추세선을 그리는 그런 칠면조가 있지만 그는 "확인되지 않은 프랙탈", 즉 두 번째 막대는 프랙탈 이후에 아직 형성되지 않았고 선이 이미 그려졌습니다. 첫 번째 막대가 아닌 두 번째 막대 뒤에 그리는 방법은 무엇입니까? 탭의 터키.


노력하다
파일:
 
Figar0 :

노력하다
전혀 그리지 않는다