초보자의 질문 MQL4 MT4 MetaTrader 4 - 페이지 70

 
안녕하세요! MT4에서 함수 작성을 도와주세요. 나는 계좌 잔고 (AccountBalance)를 알고, 내가 개설할 거래의 수(예: 9)를 알고, 위험(예: AccountBalance의 3%)을 알고, 첫 번째 거래의 로트를 계산해야 하는 경우 각 다음 로트는 두 배로 증가하고 모든 거래는 하나씩 서로 겹칩니다.
 //Функция расчета торгового лота
double GetLots()
{
 double clots = 0.0 ;
 double cl = NormalizeDouble ( MarketInfo ( Symbol (), MODE_MAXLOT ), 2 ); 
 double L2 = NormalizeDouble (cl * Multipler, 2 );
 double L3 = NormalizeDouble (L2 * Multipler, 2 );
 double L4 = NormalizeDouble (L3 * Multipler, 2 );
 double L5 = NormalizeDouble (L4 * Multipler, 2 );
 double L6 = NormalizeDouble (L5 * Multipler, 2 );
 double L7 = NormalizeDouble (L6 * Multipler, 2 );
 double L8 = NormalizeDouble (L7 * Multipler, 2 );
 double L9 = NormalizeDouble (L8 * Multipler, 2 );
 
 for (cl = NormalizeDouble ( MarketInfo ( Symbol (), MODE_MAXLOT ), 2 ); AccountFreeMarginCheck ( Symbol (), OP_BUY ,L9) <= ( AccountBalance ()/ 100 )*Risk;cl--)
 {
   if (! IsStopped ()) 
  {
   clots = NormalizeDouble (cl, 2 );
  }
 } 
 return (clots);
}

여기 무슨 일이 있었는지. 무엇이 잘못되었는지 알려주세요. 미리 감사드립니다!

 

안녕하세요!

내가 여기에 글을 쓰고 있는 이유는 mq4에 아무도 없는 것 같습니다.

내가 뭘 잘못하고 있는지 말해줘? 옵션 2가 작동하지 않습니다.

 double A[][ 10 ];
int renge_A_one= 0 ;                                                     // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two= 0 ;                                                     // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][ 10 ];
int renge_B_one= 0 ;                                                     // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two= 0 ;                                                     // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B= 0 ;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
    renge_A_one== ArrayRange (A, 0 );                                     // Выясняем Размер первого измерения (число строк)
    renge_A_two== ArrayRange (A, 1 );                                     // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
     for ( int i= 0 ; i<range_A_one; i++)                                   // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize (B, count_B);
         for ( int j= 0 ; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
    renge_B_one== ArrayRange (B, 0 );                                     // Выясняем Размер первого измерения (число строк)
    renge_B_two== ArrayRange (B, 1 );                                     // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one== ArrayRange (A, 0 );                                     // Выясняем Размер первого измерения (число строк)
    renge_A_two== ArrayRange (A, 1 );                                     // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
     for ( int i= 0 ; i<range_A_one; i++)                                   // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if (A[i][ 3 ]> 0 )
             {
              count_B++;
               ArrayResize (B, count_B);
               for ( int j= 0 ; j<renge_A_two; j++)                         // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    renge_B_one== ArrayRange (B, 0 );                                     // Выясняем Размер первого измерения (число строк)
    renge_B_two== ArrayRange (B, 1 );                                     // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two
 
Arseniy Barudkin :
안녕하세요! MT4에서 함수 작성을 도와주세요. 나는 계좌 잔고 (AccountBalance)를 알고, 내가 개설할 거래의 수(예: 9)를 알고, 위험(예: AccountBalance의 3%)을 알고, 첫 번째 거래의 로트를 계산해야 하는 경우 각 다음 로트는 두 배로 증가하고 모든 거래는 하나씩 서로 겹칩니다.

여기 무슨 일이 있었는지. 무엇이 잘못되었는지 알려주세요. 미리 감사드립니다!

초등학교. 오류는 GetLots() 함수입니다. 모든 기능.
 
Leo59 :

안녕하세요!

내가 여기에 글을 쓰는 이유는 mq4에 아무도 없는 것 같습니다.

내가 뭘 잘못하고 있는지 말해줘? 옵션 2가 작동하지 않습니다.

 double A[][ 10 ];
int renge_A_one= 0 ;                                                     // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two= 0 ;                                                     // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][ 10 ];
int renge_B_one= 0 ;                                                     // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two= 0 ;                                                     // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B= 0 ;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
     renge_A_one == ArrayRange (A, 0 );                                      // Выясняем Размер первого измерения (число строк)
     renge_A_two == ArrayRange (A, 1 );                                      // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
     for ( int i= 0 ; i<range_A_one; i++)                                   // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize (B, count_B);
         for ( int j= 0 ; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
     renge_B_one == ArrayRange (B, 0 );                                     // Выясняем Размер первого измерения (число строк)
    renge_B_two == ArrayRange (B, 1 );                                      // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one == ArrayRange (A, 0 );                                     // Выясняем Размер первого измерения (число строк)
    renge_A_two == ArrayRange (A, 1 );                                     // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
     for ( int i= 0 ; i<range_A_one; i++)                                   // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if (A[i][ 3 ]> 0 )
             {
              count_B++;
               ArrayResize (B, count_B);
               for ( int j= 0 ; j<renge_A_two; j++)                         // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    r enge_B_one == ArrayRange (B, 0 );                                     // Выясняем Размер первого измерения (число строк)
    renge_B_two == ArrayRange (B, 1 );                                      // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two

강조 표시됨: 할당이 있어야 합니다 - "=", 비교가 있어야 합니다 - "==".

 

안녕하세요 !
저는 mt4에서 로봇을 작성하는 법을 배우고 있으며 바이너리 옵션으로 시작하기로 결정했습니다. 저는 가장 간단한 Expert Advisor를 작성하고 있으며 컴파일러는 처리할 수 없는 많은 경고를 발행합니다(
도움말: "MQL4 전문가 정보" =))))))
미리 감사드립니다!)

다음은 어드바이저 코드입니다.

//+----------------------------------------------- --------------------+
//| Bolinger_Bands_traider.mq4 |
//| 저작권 2017, Penrov Nikolay |
//| vk.com/buzamonolit |
//+----------------------------------------------- --------------------+
#property copyright "Copyright 2017, Petrov Nikolay"
#속성 링크 "vk.com/buzamonolit"
#속성 버전 "1.00"
#속성엄격
//+----------------------------------------------- --------------------+
//| 전문가 초기화 기능 |
//+----------------------------------------------- --------------------+
extern int Bolinger_Bands = 20; // 볼린저 밴드 기간
외부 이중 델타 = 0.0003; // 주문을 여는 거리

문자열 기호; // 금융의 이름. 도구
정수 합계; // 주문 수

//+----------------------------------------------- --------------------+
//| 전문가 초기화 기능 |
//+----------------------------------------------- --------------------+
정수 초기화()
{
//----
초기화_객체(0);
//----
리턴(0);
}
//+----------------------------------------------- --------------------+
//| 전문가 초기화 해제 기능 |
//+----------------------------------------------- --------------------+
정수 초기화()
{
//----

//----
리턴(0);
}
//+----------------------------------------------- --------------------+
//| 전문가 시작 기능 |
//+----------------------------------------------- --------------------+
정수 시작()
{
//----
이중 가격 = 입찰;
이중 CurrBol_High = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_UPPER, 0);
이중 CurrBol_Low = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_LOWER, 0);
이중 PriceBol_High = 가격 - CurrBol_High;
이중 PriceBol_Low = 가격 - CurrBol_Low;
날짜/시간 NextClose = 시간[0] + 기간()*60*2;
int MinutesToNextClose = (NextClose - TimeCurrent())/60 + 1;
실수;

// 주문에 대한 회계
기호=기호(); // fin.instr의 이름.
총=0; // 주문 수
for(int i=1; i<=OrdersTotal(); i++) // 순서를 통해 루프
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // 다음이 있는 경우
{ // 주문 분석:
if (OrderSymbol()!=Symb) 계속; // 핀란드어가 아닙니다. 도구
if (OrderType()>1) // 보류 중입니다.
{
Alert("대기 중인 주문이 감지되었습니다. Expert Advisor가 작동하지 않습니다.");
리턴(0); // start()에서 종료
}
총++; // 시장 카운터 큰 떼거리
if (Total>1) // 하나 이상의 주문
{
Alert("여러 개의 시장 주문입니다. Expert Advisor가 작동하지 않습니다.");
리턴(0); // start()에서 종료
}
}
}

ObjectSetText("Obj_Label", "TF" + Period() + ", " + DoubleToStr(price, 5) + ", tick " + TimeToStr(TimeCurrent(), TIME_SECONDS) + ", O@" + TimeToStr(Time[0 ], TIME_MINUTES) + ", NC@" + TimeToStr(NextClose, TIME_MINUTES) + "(" + MinutesToNextClose + " min)", 10, "Arial", DarkGreen );
ObjectSetText("Obj_Label2", "주문: " + 총계 + ", delta " + DoubleToStr(Delta,5) + ", MA까지의 거리:" + DoubleToStr(PriceBol_High, 5), 10, "Arial", DarkGreen );
ObjectSetText("Obj_Label3", "주문: " + 총계 + ", delta " + DoubleToStr(Delta,5) + ", MA까지의 거리:" + DoubleToStr(PriceBol_Low, 5), 10, "Arial", DarkGreen );


// 가격 분석 및 주문 개시

if ((MathAbs(PriceBol_Low) < Delta) && (price > CurrBol_Low) && (Open[0] > CurrBol_Low+Delta) && (Total<1))
{
if (OrderSend(Symbol(), OP_BUY, 1.00,Bid, 3, 0, 0,"BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Green) >0) Print("열린 OK");
또 다른
{
err=GetLastError();
print("오류(",오류,")");
리턴(0);

}
Print("CALL @ " + 가격 + " " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp in " + MinutesToNextClose);

}

if ((MathAbs(PriceBol_High) < Delta) && (price < CurrBol_High) && (Open[0] < CurrBol_High-Delta) && (Total<1))
{
if (OrderSend(Symbol(), OP_SELL, 1.00,Bid , 3, 0, 0,"BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Red) > 0) Print("열린 OK");
또 다른
{
err=GetLastError();
print("오류(",오류,")");
리턴(0);

}
인쇄("PUT @ " + 가격 + " " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp in " + MinutesToNextClose);

}

//----
리턴(0);
}
//+----------------------------------------------- --------------------+

int Initialize_Objects(int Win) // 사용자 함수
{ // ..객체 생성
ObjectCreate("Obj_Label",OBJ_LABEL, 승리, 0,0); // 객체 생성
ObjectSet("Obj_Label", OBJPROP_CORNER, 0); // 모서리에 스냅
ObjectSet("Obj_Label", OBJPROP_XDISTANCE, 13); // X 좌표
경우 (승 == 0)
ObjectSet("Obj_Label",OBJPROP_YDISTANCE, 15);// Y 좌표
또 다른
ObjectSet("Obj_Label",OBJPROP_YDISTANCE,15);// Y 좌표

ObjectCreate("Obj_Label2",OBJ_LABEL, 승리, 0,0); // 객체 생성
ObjectSet("Obj_Label2", OBJPROP_CORNER, 0); // 모서리에 스냅
ObjectSet("Obj_Label2", OBJPROP_XDISTANCE, 13); // X 좌표
경우 (승 == 0)
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);// Y 좌표
또 다른
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);// Y 좌표

ObjectCreate("Obj_Label3",OBJ_LABEL, 승리, 0,0); // 객체 생성
ObjectSet("Obj_Label3", OBJPROP_CORNER, 0); // 모서리에 스냅
ObjectSet("Obj_Label3", OBJPROP_XDISTANCE, 13); // X 좌표
경우 (승 == 0)
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);// Y 좌표
또 다른
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);// Y 좌표

리턴(0); // 사용자 함수 종료
}

 

그리고 여기에 경고가 있습니다. 나는 그가 무엇을 좋아하지 않는지 알 수 없다


유형 변환으로 인한 데이터 손실 가능성 Bolinger_Bands_traider.mq4 51 24
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 76 35
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 76 227
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 77 43
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 78 43
'문자열'에서 '숫자'로의 암시적 변환 Bolinger_Bands_traider.mq4 85 71
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 93 23
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 93 91
'문자열'에서 '숫자'로의 암시적 변환 Bolinger_Bands_traider.mq4 99 72
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 107 23
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 107 91
오류 0개, 경고 11개, 컴파일 시간: 204밀리초 1 12

 
Vitalie Postolache :
초등학교. 오류는 GetLots() 함수입니다. 모든 기능.

올바르게 쓰는 방법을 알려주실 수 있습니까? 최대 로트에서 반복하여 루프를 사용하여 계산하고 싶었습니다.
 
Arseniy Barudkin :

올바르게 쓰는 방법을 알려주실 수 있습니까? 최대 로트에서 반복하여 루프를 사용하여 계산하고 싶었습니다.


논리는 어디에 있습니까? 당신은 첫 번째 주문에 최대 허용 로트를 넣고 다음 주문마다 그것을 늘립니다. 냉정하게 말하면 그다지 합리적이지 않다고 생각하지 않습니까?

또한 루프에서 완전히 비논리적인 방법으로 첫 번째 주문의 로트를 줄이고 그 이전에 "계산된" 다른 주문의 로트는 변경되지 않고 유지되며 이러한 값은 의 한계를 초과하지 않습니다. 이 기능 . 그렇다면 그들은 왜?

루프 증분이 실수가 될 수 없다는 사실은 말할 것도 없고, 카운터이고 정수여야 합니다. 그리고 로트의 값을 카운터로 설정하고 각 반복에서 1씩 뺍니다. 이것은 큰 실수이며 매우 심각한 것입니다.

먼저 머리 속에서 논리를 다듬은 다음 코드로 변환해 보십시오.

 
bog_v_nas :

그리고 여기에 경고가 있습니다. 나는 그가 무엇을 좋아하지 않는지 알 수 없다


유형 변환으로 인한 데이터 손실 가능성 Bolinger_Bands_traider.mq4 51 24
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 76 35
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 76 227
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 77 43
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 78 43
'문자열'에서 '숫자'로의 암시적 변환 Bolinger_Bands_traider.mq4 85 71
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 93 23
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 93 91
'문자열'에서 '숫자'로의 암시적 변환 Bolinger_Bands_traider.mq4 99 72
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 107 23
'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 107 91
오류 0개, 경고 11개, 컴파일 시간: 204밀리초 1 12

숫자 51로 한 줄을 인쇄하십시오. "유형 변환으로 인한 데이터 손실 가능성 Bolinger_Bands_traider.mq4 51 24" 오류를 이해하기 위해 여기에서 계산하지 마십시오.

나머지: "'숫자'에서 '문자열'로의 암시적 변환 Bolinger_Bands_traider.mq4 107 91"은 필요한 것을 말합니다.

숫자 값을 객체를 생성하는 텍스트 문자열로 변환합니다(예: 텍스트 문자열).

기간()

해야한다

DoubleToString(Period(),0)

 
Renat Akhtyamov :

숫자 값을 객체를 생성하는 텍스트 문자열로 변환합니다(예: 텍스트 문자열).

기간()

해야한다

DoubleToString(Period(),0)


그리고 마침표 유형 Double 은 언제부터입니까?
사유: