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

 
Alexey Viktorov :
예를 들어 여기 https://docs.mql4.com/ru/basis/preprosessor/compilation
고맙습니다!
 
trader781 :

현재 예에서 나는 그 이상으로 진행되지 않도록 거기에 임의의 로트와 함께 무한한 수의 주문 을 넣을 수 있기를 원합니다.

물론 우리는 경계를 알고 모두가 알고 있지만 그렇게 원합니다.

나는 대괄호 안에 요소를 지정하면 마지막 요소가 될 것이라는 사실에서 진행합니다.

여기 내가 이 쓰레기를 얻은 것이 있습니다. 무리를 순서대로 볼 거라고 예상했는데... 많이? 그래서 많은 대신에 결과를 주문에 추가합니다(많은 종류의 주문 * 계수)

거기에서 데이터를 추출하는 문제

나는 내가 상상하는대로 얻고 싶다

마이어레이[0][0.01]

마이어레이[1][0.01]

마이어레이[2][0.02]

등...

글쎄, 실제 질문은 무엇입니까?

로트가 있는 배열을 작성한 다음 로트 크기별로 정렬합니다. 귀하의 경우 각 다음 위치가 더 큰 로트로 열리기 때문에 이것은 여는 숫자로 정렬됩니다.

double BPosMass[];
double SPosMass[];

void OnTick ()
{
// Заполняем массивы
int b=- 1 ,s=- 1 ; // Объявим переменные с минусом
   for ( int i= 0 ; i< OrdersTotal (); i++) {
   if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) {
     if ( OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==Magic || Magic< 0 )) {
     if ( OrderType ()== OP_BUY ) {
      b++;
       ArrayResize (BPosMass,b+ 1 );
       BPosMass[b]= OrderLot();
     }
     if ( OrderType ()== OP_SELL ) {
      s++;
       ArrayResize (SPosMass,s+ 1 );
       SPosMass[s]= OrderLot();
     }
  }}} // конец записи массив

// Читаем отсортированный массив с лотами
// Buy
   if (b> 0 ) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
     ArraySort (BPosMass, WHOLE_ARRAY , 0 , MODE_ASCEND ); //  Отсортируем по размеру лота
     // Работа с полученными данными
     Comment ( "Самый старый Buy лот: " ,    BPosMass[ 0 ],
             "\nПоследний Buy лот: " ,     BPosMass[b],
             "\nПредпоследний Buy лот: " , BPosMass[b- 1 ]
           );

  } // end Buy

// Sell
   if (s> 0 ) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
     ArraySort (SPosMass, WHOLE_ARRAY , 0 , MODE_ASCEND ); // Отсортируем по размеру лота
     // Работа с полученными данными
     Comment ( "Самый старый Sell лот: " ,    SPosMass[ 0 ],
             "\nПоследний Sell лот: " ,     SPosMass[s],
             "\nПредпоследний Sell лот: " , SPosMass[s- 1 ]
           );

  } // end Sell
  
// Конец функции OnTick()
}


그런 다음 다음과 같이 적용합니다. 총 위치 수를 세고 3보다 작으면 배열에 액세스하지 않고 더 많으면 배열을 읽고 데이터를 가져옵니다.

배열 종료는 쓰는 시점이 아니라 읽는 시점에 발생합니다.

 
Vitaly Muzichenko :


배열 종료는 쓰는 시점이 아니라 읽는 시점에 발생합니다.

아니요. 존재하지 않는 배열 인덱스 에 접근할 때 .
 
Vitalie Postolache :
아니요. 존재하지 않는 배열 인덱스 에 접근할 때 .
글쎄, 내가 무엇을 썼습니까?
 
Vitaly Muzichenko :
글쎄, 내가 무엇을 썼습니까?

2017.01 . 열셋   12 : 51 : 14.372   2017.01 . 05   16:30:00 마틴 GBPUSD , M5 : MyArray [CountOrders][ 0 ] 0.02
2017.01 . 열셋   12 : 51 : 14.372   2017.01 . 05   16:25:00 마틴 GBPUSD,M5 : MyArray [ 주문 수][ 0 ] 0.01

CountOrders는 일정하고 로트가 변경됩니다. 이러면 안되지만 다른 방법은 없습니다.

이상적으로 항목 MyArray[CountOrders][ OrderLots() ]

결과를 제공하려면 MyArray[0][0.01] MyArray[1][0.01]

그러나 이것은 µl에서 작동하지 않습니다

글쎄, 그리고 그것은 어떻게 든 함수에서 스트림으로 추출됩니다.
 
trader781 :

2017.01 . 열셋   12 : 51 : 14.372   2017.01 . 05   16:30:00 마틴 GBPUSD , M5 : MyArray [CountOrders][ 0 ] 0.02
2017.01 . 열셋   12 : 51 : 14.372   2017.01 . 05   16:25:00 마틴 GBPUSD,M5 : MyArray [ 주문 수][ 0 ] 0.01

CountOrders는 일정하고 로트가 변경됩니다. 이러면 안되지만 다른 방법은 없습니다.

이상적으로는 항목 MyArray[CountOrders][ OrderLots() ]

결과를 제공하려면 MyArray[0][0.01] MyArray[1][0.01]

그러나 이것은 µl에서 작동하지 않습니다

구조가 당신을 도울 것입니다. 필요한 필드로 구조를 만들고, 그러한 구조 의 배열을 선언하고 , 시간을 열어 주기로 주문 데이터로 채우고, 마음이 원하는 대로 검색합니다. 인덱스로 구조체의 필드를 확인하고 필요한 값과 비교합니다. 인덱스는 시작 시간으로 주문의 일련 번호를 가리키고 구조 필드에는 이 특정 주문에 필요한 모든 데이터가 포함됩니다.
 
Artyom Trishkin :
구조가 당신을 도울 것입니다. 필수 필드를 사용하여 구조를 만들고 이러한 구조 의 배열을 선언하고 시간을 열어 주기로 주문 데이터로 채우고 원하는 것을 검색합니다. 인덱스로 구조체의 필드를 확인하고 필요한 값과 비교합니다. 인덱스는 시작 시간으로 주문의 일련 번호를 가리키고 구조 필드에는 이 특정 주문에 필요한 모든 데이터가 포함됩니다.

우리는 그런 빌어먹을 것을 얻었다

struct myorder
{
int     Ticket;
double orderopenprice;
int    ordertype;
double profit;
double stoploss;
double   lot;
};

myorder orders[];

int i;
void CalcOrders()
{
for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) && ( OrderSymbol ()== Symbol ())
         && ( OrderMagicNumber ()==Magic) && ( OrderType ()< 2 ))
         orders[i].Ticket= OrderTicket ();
         orders[i].lot= OrderLots ();
         orders[i].orderopenprice= OrderOpenPrice ();
         orders[i].ordertype= OrderType ();
         orders[i].profit= OrderProfit ();
         orders[i].stoploss= OrderStopLoss ();
     }
}    


예를 들어 주문의 로트 5를 뽑아 세 번째 로트와 비교하고 싶습니다.

시가를 합산하고 포지션 수로 나눕니다.

그러한 명령의 형태로 항목 자체가 필요합니다

 
trader781 :

우리는 그런 빌어먹을 일이 있어

struct myorder
{
int     Ticket;
double orderopenprice;
int    ordertype;
double profit;
double stoploss;
double   lot;
};

myorder orders[];

int i;
void CalcOrders()
{
for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) && ( OrderSymbol ()== Symbol ())
         && ( OrderMagicNumber ()==Magic) && ( OrderType ()< 2 ))
         orders[i].Ticket= OrderTicket ();
         orders[i].lot= OrderLots ();
         orders[i].orderopenprice= OrderOpenPrice ();
         orders[i].ordertype= OrderType ();
         orders[i].profit= OrderProfit ();
         orders[i].stoploss= OrderStopLoss ();
     }
}    


예를 들어 주문의 로트 5를 뽑아 세 번째 로트와 비교하고 싶습니다.

시가를 합산하고 포지션 수로 나눕니다.

이에 대한 명령 형식의 항목 자체가 필요합니다.

주기 인덱스 i는 필요한 주문뿐만 아니라 모든 주문을 참조하기 때문에 함수에서 변수를 선언해야 합니다(예: n=0;). 이 변수 는 배열의 크기를 담당합니다. 루프 내에서 검사를 통과한 후 이 변수의 값을 늘리고 이 변수의 값만큼 배열의 크기를 늘리고 인덱스 n-1의 구조 필드를 이미 채우십시오: orders[n-1].xxx =XXX;

 

OrdersTotal() 함수를 사용하여 주문을 정렬할 때 -1을 쓰는 이유를 알려주세요.

예: for (i=OrdersTotal()-1 ;i>=0; i--)

왜 OrdersTotal() 만 아닌가요?

이 함수의 주문 수는 0부터 시작합니까 아니면 1부터 시작합니까? 즉, 하나의 주문이 있는 경우 OrdersTotal()은 0 또는 1과 같습니까?

 
Artyom Trishkin :

주기 인덱스 i는 필요한 주문뿐만 아니라 모든 주문을 참조하기 때문에 함수에서 변수를 선언해야 합니다(예: n=0;). 이 변수는 배열의 크기를 담당합니다. 루프 내에서 검사를 통과한 후 이 변수의 값을 늘리고 이 변수의 값만큼 배열의 크기를 늘리고 인덱스 n-1의 구조 필드를 이미 채우십시오: orders[n-1].xxx =XXX;

주문이 많은데 왜 제대로 된 주문을 받고 바로 꺼낼 수 없습니까? (필수) 원하는 대로 그들과 함께 하시겠습니까? 예를 들어 주문 (i-4)