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

 
a196012a :

볼륨이 0.1인 주문을 열기 위한 블록으로 코드를 보완했습니다(void start() 함수 직후

그러나 어떤 이유로 프로그램은 이러한 주문 마감(0.3랏)에 대한 응답으로 증가된 주문을 열지 않습니다.

귀하의 코드에서 내가 이해하지 못하는 점

1. МН=123을 올바르게 이해하면 볼륨이 0.3인 주문만 할당합니다.

날짜/시간 함수 SearTim(int s)에서 MH=123이지만 볼륨이 0.1인 주문을 찾고 있습니다.

그러나 이 MN은 0.1의 주문에만 할당되기 때문에 0.1의 볼륨을 가진 주문은 MN=123을 가질 수 없습니다.

2. datetime SearTim(int s) 및 int sear() 함수의 본문에서, 또는 오히려 주석에서 0.3의 볼륨으로 주문을 열어야 함을 나타냅니다.

동일한 조건에서 볼륨이 증가한 주문을 두 번 이상 여는 이유를 이해하지 못합니다.

결국 첫 번째 블록에서 볼륨이 증가한 주문을 이미 열었습니다.



0.1의 각 주문을 마감한 후 0.3의 볼륨으로 주문을 열고 0.1의 볼륨으로 주문의 시작 시간 값을 저장하는 코드를 작성하면 매우 감사하겠습니다.

이 경우, 나는 당신의 코드에서 내 질문에 대한 모든 답을 찾기 위해 지금까지 나의 겸손한 지식과 참고 문헌인 Print() 함수 를 사용하기 위해 최선을 다할 것입니다.

노트:

볼륨이 0.1이고 볼륨이 0.3인 동일한 유형의 모든 주문이 있습니다(SEL만). 따라서 내가 틀리지 않았다면 int sear() 함수에서 주문 유형(BUY 또는 SELL)을 계산할 필요가 없을 수도 있습니다.

내 프로그램의 궁극적인 목표는 주문 후 0.1의 볼륨으로 주문을 여는 시간(분이 아니라 초가 아니라 시간만)의 값을 기억하는 것임을 다시 한 번 상기시켜 드립니다. 종가에서 열린 0.3의 거래량은 CL에 의해 마감되었습니다.


프로그래밍 언어를 알아야 하기 때문에 많은 설명을 드리지 못해 죄송합니다. 나는 당신이 이미 무언가를 프로그래밍하고 있고 프로그래밍을 아는 사람에게 의지하고 있다고 생각했습니다.

프로그래밍을 먼저 배워야 합니다. 내가 무엇을, 어떻게 설명하면 이것은 프로그래밍 언어를 가르치는 것입니다.

Expert Advisors의 예를 보고 작성 방법을 살펴보고 가장 작은 것부터 프로그램을 작성해 보십시오. 그리고 당신은 이미 복잡한 프로그램을 작성하려고 합니다.

다음은 명령 및 예제 모듈 작성에 대한 자습서 및 예제입니다.

파일:
MQL4.zip  2226 kb
 

나는 그런 간단한 질문을 하고 있습니다. 여기에 닫는 블록이 있습니다.

주문의 이익이 플러스가 되면 그는 이 주문을 마감하고 이 전체 이익에 대해 가능한 한 무익한 포지션을 닫습니다. Perekr이 활성화된 경우.


수익성 있는 포지션의 이익이 무익한 포지션의 모든 손실을 덮을 때, 즉 한 주문의 이익이 다른 주문의 손실보다 크거나 같을 때만 두 포지션을 모두 닫도록 변경해야 합니다.

if(Mas_Tip[1]>0)

     {

      if(Bidt-step*Point>=NormalizeDouble(Bid,Digits))

        {

         Profit=AccountBalance()-StartProfit;

         Askt=NormalizeDouble(Ask,Digits);

         Bidt=NormalizeDouble(Bid,Digits);

         for(int i=1; i<=OrdersTotal(); i++)

           {

            if(OrderSelect(i-1,SELECT_BY_POS)==true && OrderType()==OP_SELL && 

               OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

              {

               if(Razn<2)

                 {


                  if(Perekr && OrderProfit()>0 && max_lot>=Lots_per) //перекрытие

                    {

                     double profit=OrderProfit();

                     Print("закрываю по перекрытию");


                     ClosePosBySelect(OrderLots());

                     for(int f=OrdersTotal()-1;f>=0;f--)

                       {

                        if(OrderSelect(f,SELECT_BY_POS)==true && OrderType()==OP_BUY && 

                           OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

                          {

                           if(OrderProfit()<0)

                             {

                              if(profit>=MathAbs(OrderProfit()))

                                {

                                 Print("закрываю по перекрытию");


                                 ClosePosBySelect(OrderLots());

                                }

 

친구들, 안녕. 초보자를 도와주세요.

가격이 지표를 넘을 때 이에 대한 메시지가 내 이메일로 전송되기를 바랍니다. 방법을 알아낸 것 같지만 이 교차가 일어나자마자 현재 촛불이 닫힐 때까지 끝없이 수백 통의 메일이 발송된다. 메시지를 하나만 보내려면 어떻게 해야 합니까? 다음은 예입니다.

if((iSAR(NULL, 0,단계,최대, 1)< iClose (NULL,0,1))&&(iSAR(NULL, 0,단계,최대, 2)>iClose(NULL,0,2))) {

bool res = SendMail("구매 신호", "구매 신호");

}


if((iSAR(NULL, 0,단계,최대, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,단계,최대, 2)<iClose(NULL,0,2))) {

SendMail("매도 신호", "매도 신호");

}

 
ev85 :

친구들, 안녕. 초보자를 도와주세요.

가격이 지표를 넘을 때 이에 대한 메시지가 내 이메일로 전송되기를 바랍니다. 방법을 알아낸 것 같지만 이 교차가 일어나자마자 현재 촛불이 닫힐 때까지 끝없이 수백 통의 메일이 발송된다. 메시지를 하나만 보내려면 어떻게 해야 합니까? 다음은 예입니다.

if((iSAR(NULL, 0, 단계, 최대, 1)<iClose(NULL,0,1))&&(iSAR(NULL, 0,단계,최대, 2)>iClose(NULL,0,2))) {

bool res = SendMail("구매 신호", "구매 신호");

}


if((iSAR(NULL, 0,단계,최대, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,단계,최대, 2)<iClose(NULL,0,2))) {

SendMail("매도 신호", "매도 신호");

}

포물선을 사용하면 모든 것이 간단합니다. 상태에 플래그를 넣으십시오. 또는 int 유형의 단순 변수이고 각 신호에 따라 값이 변경됩니다.

 static bool flag;
 if (flag && iSAR ( NULL , 0 ,Step,Maximum, 1 ) < iClose ( NULL , 0 , 1 ) && iSAR ( NULL , 0 ,Step,Maximum, 2 ) > iClose ( NULL , 0 , 2 )){

 bool res = SendMail ( "Сигнал на покупку" ,   "Сигнал на покупку" );
 flag = false ;
 }


 if (!flag && iSAR ( NULL , 0 ,Step,Maximum, 1 ) > iClose ( NULL , 0 , 1 ) && iSAR ( NULL , 0 ,Step,Maximum, 2 ) < iClose ( NULL , 0 , 2 )){

 SendMail ( "Сигнал на продаж" ,   "Сигнал на продажу" );
 flag = true ;
 }
 

모두에게 좋은 하루! Trailing Stop을 처리할 수 있도록 도와주세요. 나는 Expert Advisor Trailing에게 처음에 SL = 100이 있고 가격이 포지션 개시보다 30포인트 높을 때 Trailing이 작동해야 한다는 조건으로 편지를 썼습니다. 그는 포지션을 연 직후 수정하고 표준 SL을 30으로 변경한 후 이동합니다.

무효 후행()

{

int SLoss = 1;

이중 StopL = NormalizeDouble(OrderOpenPrice() + SLoss*Point, Digits);

이중 StopL2 = NormalizeDouble(OrderOpenPrice() - SLoss*Point, Digits);

for (int i=OrdersTotal() - 1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

{

if (OrderType() == OP_BUY && OrderStopLoss() >= StopL)

{

if (입찰가 - StopL > TrailingStop*Point)

{

if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep)*Point)

{

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*Point, Digits), 0, 0))

Print("판매 주문 수정 오류 !");

}

}

}

if (OrderType() == OP_SELL && OrderStopLoss() <= StopL2)

{

if (StopL2 - 묻기 > TrailingStop*Point)

{

if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep)*Point)

{

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*Point, Digits), 0, 0))

Print("판매 주문 수정 오류!");

}

}

}

}

}

}

}

 
Alexey Viktorov :

포물선을 사용하면 모든 것이 간단하고 상태에 플래그를 둡니다. 또는 int 유형의 단순 변수이고 각 신호에 따라 값이 변경됩니다.

나는 방금 else를 잊어 버렸습니다. 그렇지 않으면 첫 번째 신호 후에 정적 변수가 true로 유지됩니다.
 
AlGuru :

모두에게 좋은 하루! Trailing Stop을 처리할 수 있도록 도와주세요. 나는 Expert Advisor Trailing에게 처음에 SL = 100이 있고 가격이 포지션 개시보다 30포인트 높을 때 Trailing이 작동해야 한다는 조건으로 편지를 썼습니다. 그는 포지션을 연 직후 수정하고 표준 SL을 30으로 변경한 후 이동합니다.

...
도움이 될까요? 거기에서 당신이 원하는 것은 무엇이든 할 수 있는 템플릿을 마련했습니다.
 
Artyom Trishkin :
나는 방금 else를 잊어 버렸습니다. 그렇지 않으면 첫 번째 신호 후에 정적 변수가 true로 유지됩니다.

엘사가 왜 거기 있어? 내 의견으로는 flag == true이면 충분합니다. 또는 플래그 == false; 코드에 있는 것

 if ( flag && ****

if ( ! flag && ****

한 방향으로 건널 때 우리는 다른 쪽에서 교차로를 기다리고 있습니다... 그래서 폐쇄된 사이클입니다. 그러나 처음 시작할 때 올바르게 연결하는 방법은 스스로 생각하게하십시오. 아니면 나중에 물어보세요...

 
Alexey Viktorov :

엘사가 왜 거기 있어? 내 의견으로는 flag == true이면 충분합니다. 또는 플래그 == false; 코드에 있는 것

한 방향으로 건널 때 우리는 다른 쪽에서 교차로를 기다리고 있습니다... 그래서 폐쇄된 사이클입니다. 그러나 처음 시작할 때 올바르게 연결하는 방법은 스스로 생각하게하십시오. 아니면 나중에 물어보세요...

다른 막대의 두 신호가 같은 방향으로 간다면?

스윙만 하면 됩니다.

하지만 결국 시그널이 있을 때 항상 시그널을 보내야 하지만 시그널 결정은 이미 따로따로 내려져 있다.

각 방향에 대해 자체 플래그를 갖고 앞뒤로 전환하는 것이 가장 좋은 것 같습니다. 그러나 한 방향의 신호가 반대 방향의 신호에 의존하는 것은 아닙니다.

 
Artyom Trishkin :

다른 막대의 두 신호가 같은 방향으로 간다면?

스윙만 하면 됩니다.

하지만 결국 시그널이 있을 때 항상 시그널을 보내야 하지만 시그널 결정은 이미 따로따로 내려져 있다.

각 방향에 대해 자체 플래그를 갖고 앞뒤로 전환하는 것이 가장 좋은 것 같습니다. 그러나 한 방향의 신호가 반대 방향의 신호에 의존하는 것은 아닙니다.

Artyom, 내가 그 말로 대답을 시작한 것은 헛되지 않았다

포물선은 교대가 엄격하며 한 방향의 두 신호는 다른 막대에서도 불가능합니다. 그리고 이를 위해 아무 것도 발명할 필요가 없습니다. MA와 같은 제로 바에서도 덜거덕거리지 않습니다.