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

 
Artyom Trishkin :
그리고 당신은 당신의 코드의 일부를 보여주지 않았습니다 - 무엇의 예를 보여줄지 명확하지 않습니다.

struct p{

double trailingProfit;

int orders[10];

bool flagOpen;// флаг , указывающий на открытость позиции

//тут еще куча связанных параметров

};


p order[];

int OrderN=-1;


int OnInit()
  {

   ArrayResize(pair,1,1000);
 

   return(INIT_SUCCEEDED);
  }

void openOrder(price){

       OrderN++;

       int t;

       ArrayResize(orders,order+1);

      t=OrderSend(Symbol(),OP_BUYSTOP,2,(NormalizeDouble(price,Digits)),3,0,0,"pair",MAGICN,0,Blue);
      if(t==0) Print("не удалось выставить ордер BUYSTOP ", price);

      for(intj=0,j<10,++j){     

      if(orders[OrderN].orders==0) orders[OrderN].orders=t;

      break;

      }

      orders[OrderN].flagOpen=1;

}

//...... тут идет обработка позиций...

void massCut(){

// нужна вот такая функция

}

Expert Advisor가 장시간 작동하면 어레이가 처리하기에 너무 커서 이를 줄여야 할 필요가 있다. 모든 오래된 마감된 주문은 처음에 있으며 처음 발견된 열린 주문 이후의 모든 것은 남겨두어야 합니다.
 
Evgenii :

...
Expert Advisor가 장시간 작동하면 어레이가 처리하기에 너무 커서 이를 줄여야 할 필요가 있다. 모든 오래된 마감된 주문은 처음에 있으며 처음 발견된 열린 주문 이후의 모든 것은 남겨두어야 합니다.

EA가 다시 시작되면 구조 배열은 어떻게 됩니까?

 
Artyom Trishkin :

EA가 다시 시작되면 구조 배열은 어떻게 됩니까?

어레이가 날아갈 것이고 이 문제는 해결되지 않습니다.
 
Evgenii :
어레이가 날아갈 것이고 이 문제는 해결되지 않습니다.

투표. 그리고 그것이 가장 먼저 생각한 것이었습니다.

결론은 다음과 같습니다. 어레이를 0으로 재설정하고 주문 및 위치의 현재 상태로 다시 채워야 합니다. 그러나 계정 의 주문 또는 위치 수가 변경되었다는 사실을 파악한 경우에만 이 작업을 수행해야 합니다.

항상 현재 주문 및 위치의 현재 상태만 사용할 수 있으며 어레이에서 존재하지 않는 주문/위치를 삭제하여 춤을 만들 필요가 없습니다. 그리고 주문/포지션 목록은 완전히 스크롤되거나 주어진 기록 깊이 간격만큼 스크롤되어야 하지만 계정의 주문/포지션 수를 변경하는 특정 경우에만 가능합니다.

 
Alexey Viktorov :
왜 그런 변태인가?

OnInit가 재초기화할 때마다 회전하지 않고 정적 배열 을 하나의 인스턴스로 줄이도록 합니다. 일부 장소에서는 두 번 작성되기 때문입니다. 일반적으로 이것은 리소스 최적화입니다.
.. 글쎄, 나는 그것을 그대로 둘 것이다, 그것이 지금보다 더 쉽다.
 
LRA :
크기를 지정하지 않고 전역 배열을 선언합니다. 함수는 크기를 ArrayResize로 설정합니다. 그리고 전 세계적으로 볼 수 있고 OnInit가 해제됩니다...

정확하지 않습니다. 아마도 명확하게 정의된 값이 있는 정적 배열은 별도로 초기화하는 것이 의미가 없을 것입니다(
 
Money_Maker :

OnInit가 재초기화할 때마다 회전하지 않고 정적 배열 을 하나의 인스턴스로 줄이도록 합니다. 일부 장소에서는 두 번 작성되기 때문입니다. 일반적으로 이것은 리소스 최적화입니다.
.. 글쎄, 나는 그것을 그대로 둘 것이다, 그것이 지금보다 더 쉽다.
재초기화할 때마다 OnOnit()으로 바뀌지 않도록 UninitializeReason()을 초기화 해제하는 이유를 확인하면 충분하지만 아무것도 이해하지 못했습니다. 정적 배열을 줄이는 것은 무엇을 의미합니까??? 그리고 일반적으로 더 잘 알고 있습니다.
 
그리고 MT4 테스터에서는 커미션이 고려되지 않거나 무엇입니까?
 
Andrey Dik :
그리고 MT4 테스터에서는 커미션이 고려되지 않거나 무엇입니까?
이를 고려하려면 커미션이 있는 계정에 연결해야 하는 것 같습니다.
 

Print() 함수 에 대한 질문 ; 어떻게 Print()가 EA와 date(day)의 데이터를 인쇄하도록 합니까? 그것을 해결하는 방법? pliz는 초보자를 이해하는 데 도움이됩니다. 나는 실험을 위해 재 작업 한 코드를 게시합니다. 칠면조는 사전에 ATP를 "피벗"합니다!


코드 자체: PivotsDaily v2.mq4


#속성 표시기_차트_창

#속성 표시기_버퍼 3

#property indicator_color1 라임

#property indicator_color2 파란색

#property indicator_color3 빨간색


//---- 입력 매개변수

외부 정수 CountBars=300;

//---- 버퍼

이중 PBuffer[];

이중 S1Buffer[];

이중 R1Buffer[];


문자열 피벗 = "P", Sup1 = "S 1", Res1 = "R 1";


int 글꼴 크기 = 10;

이중 P,S1,R1,S2,R2,S3,R3;

이중 LastHigh, LastLow, x;

//+----------------------------------------------- --------------------+

//| 고객 표시기 초기화 해제 기능 |

//+----------------------------------------------- --------------------+

정수 초기화()

{


ObjectDelete("피벗");

ObjectDelete("S1");

ObjectDelete("R1");

리턴(0);

}

//+----------------------------------------------- --------------------+

//| 사용자 지정 표시기 초기화 기능 |

//+----------------------------------------------- --------------------+

정수 초기화()

{

문자열 short_name;


표시 버퍼(7);

//---- 표시줄

SetIndexStyle(0,DRAW_ARROW,2,1,라임);

SetIndexArrow(0.158);

SetIndexStyle(1,DRAW_ARROW,2,1,파란색);

SetIndexArrow(1,158);

SetIndexStyle(2,DRAW_ARROW,2,1,빨강);

SetIndexArrow(2,158);


SetIndexBuffer(0,PBuffer);

SetIndexBuffer(1,S1Buffer);

SetIndexBuffer(2,R1Buffer);


//---- DataWindow의 이름 및 표시기 하위 창 레이블

short_name="피벗";

IndicatorShortName(short_name);

SetIndexLabel(0,short_name);

short_name="R1";

IndicatorShortName(short_name);

SetIndexLabel(2,short_name);


short_name="S1";

IndicatorShortName(short_name);

SetIndexLabel(1,short_name);


SetIndexDrawBegin(0,6);

//----


리턴(0);

}

//+----------------------------------------------- --------------------+

//| 사용자 지정 표시기 반복 기능 |

//+----------------------------------------------- --------------------+

정수 시작()


{

int counted_bars=IndicatorCounted();


정수 한계, 나는;

//---- 지표 계산

if (counted_bars==0)

{

x=마침표();

if (x>CountBars) return(-1);

ObjectCreate("피벗", OBJ_TEXT, 0, 0,0);

ObjectSetText("피벗", "피벗",10,"Arial",Lime);

ObjectCreate("S1", OBJ_TEXT, 0, 0, 0);

ObjectSetText("S1", "S1",10,"Arial",Blue);

ObjectCreate("R1", OBJ_TEXT, 0, 0, 0);

ObjectSetText("R1", "R1",10,"Arial",빨간색);

}

if(counted_bars<0) return(-1);


제한=(막대 개수 계산된 막대)-1;


(i=한계, i>=0, i--)

{

if (TimeDayOfWeek(시간[i]) != 0)

{

if (High[i+1]>LastHigh) LastHigh=높음[i+1];

if (낮음[i+1]<LastLow) LastLow=낮음[i+1];

}


만약 (

TimeDay(시간[i])!=TimeDay(시간[i+1]) && TimeDayOfWeek(시간[i])!=0

)

{

P=닫기[i+1];

R1=최저가;

S1=마지막 높음;

S2=높음[i]-낮음[i];

S3=높음[i]-열림[i+1];

if(S3==0)

{R2 = S3;} 그렇지 않으면 {R2 = S2/S3;}

인쇄("R2",R2); // <= 인쇄 플러스 데이터가 날짜를 인쇄하게 하는 방법은 무엇입니까?


LastLow=열기[i]; LastHigh=열기[i];

ObjectMove("피벗", 0, 시간[i],P);

ObjectMove("S1", 0, 시간[i],S1);

ObjectMove("R1", 0, 시간[i],R1);

}

P버퍼[i]=P;

S1버퍼[i]=S1;

R1버퍼[i]=R1;

}

//----

리턴(0);

}