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

 
Anatoliy Ryzhakov :

매도 주문은 매도호가에서 마감됩니다.

잘 이해하지 못했습니다! 코드의 잼이 있는 곳에 손가락을 찔러보세요!!! ( 로그에 ORDER CLOSE ERROR 4108이 표시됨) 미리 감사드립니다!

 

좋은 하루입니다! 일년 중 가장 힘든 날에 지쳤습니까? 사업을 할 수 있습니까? ;=).

나는 고문을 그렸고 모든 것이 정상이지만 MQL은 내가 이해한 대로 MT4 환경에서 작동합니다. 그리고 거래소와 직접 작동하는 소프트웨어와 함께 작동해야 합니다. 다른 MQL 컴파일러가 있습니까? 그리고 그렇지 않다면 어떤 언어로 EA를 다시 작성하는 것이 더 낫습니다.

 
STARIJ :

휴식 시간이 있고 계속해야 합니다.

쉬는 시간이 없어요. 고문이 자신의 명령을 "보지" 않는 이유는 무엇입니까? 내 서버 와 컴퓨터의 시간이 다른데 그 이유는?

 
Anatoliy Ryzhakov : 나는 휴식이 없습니다. 고문이 자신의 명령을 "보지" 않는 이유는 무엇입니까? 내 서버와 컴퓨터의 시간이 다른데 그 이유는?

모든 사람의 시간은 다릅니다. 멀리서 서두르지 말고 시작하십시오. 1. OrdersTotal 함수 가 제공하는 것을 확인하십시오. 그 의미는 이력 설정에 따라 다릅니다: 오늘, 지난 3일, 지난 주, ... 원하는 대로 설정합니다. 2. 그런 다음 루프를 만들고 Alert 를 사용하여 모든 주문의 Magics를 표시합니다. 등. 이것을 디버깅이라고 합니다. 이는 프로그래머의 작업에서 매우 중요한 부분입니다. 코드를 작성하는 것보다 더 중요합니다.

 
실수로 볼륨(lot)의 음수 값이 설정되었을 때 Expert Advisor에서 FreeMarginCheck 함수 오류에 대한 잘못된 lot 금액을 수정하는 방법을 알려주세요. 테스터에서 오류 메시지 없이 잘못된 로트에 대한 메시지를 갖습니다.

 
STARIJ :

모든 사람의 시간은 다릅니다. 멀리서 서두르지 말고 시작하십시오. 1. OrdersTotal 함수 가 제공하는 것을 확인하십시오. 그 의미는 이력 설정에 따라 다릅니다: 오늘, 지난 3일, 지난 주, ... 원하는 대로 설정합니다. 2. 그런 다음 루프를 만들고 Alert를 사용하여 모든 주문의 Magics를 표시합니다. 등. 이것을 디버깅이라고 합니다. 이는 프로그래머의 작업에서 매우 중요한 부분입니다. 코드를 작성하는 것보다 더 중요합니다.

고맙습니다 !

 

얘들아 제발 말해줘 조건이 한 번 충족되면 어드바이저가 SL을 설정할 수 있는 기능으로 한 번에 3개의 거래를 열도록 어드바이저 코드를 작성하는 방법은 무엇입니까?

여기 내 조건이 있습니다

 if (MA_1>MA_2)
ticket= OrderSend ( _Symbol , OP_BUY ,Lots, Ask , 0 , Ask -SL* Point , Bid +TP* Point , NULL , 0 , 0 , clrGreen );
if (MA_1<MA_2)
ticket= OrderSend ( _Symbol , OP_SELL ,Lots, Bid , 0 , Bid +SL* Point , Ask -TP* Point , NULL , 0 , 0 , clrRed );

함수( OrdersTotal () )를 사용하라는 조언을 받았지만 제 경우에는 맞지 않습니다. 나는 그것을 이렇게 썼다.

 void OnTick ()
  {
//---
   double MA_1;
   MA_1= iMA ( _Symbol , 0 , 1 , 0 , 1 , 0 , 0 );
   double MA_2;
   MA_2= iMA ( _Symbol , 0 , 6 , 0 , 1 , 0 , 0 );
   int ticket= 0 ;
   if ( OrdersTotal ()<= 3 )
     {
       if (MA_1>MA_2)
         ticket= OrderSend ( _Symbol , OP_BUY ,Lots, Ask , 0 , Ask -SL* Point , Bid +TP* Point , NULL , 0 , 0 , clrGreen );
       if (MA_1<MA_2)
         ticket= OrderSend ( _Symbol , OP_SELL ,Lots, Bid , 0 , Bid +SL* Point , Ask -TP* Point , NULL , 0 , 0 , clrRed );
     }
//---
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }

컴파일된 오류는 없지만 이 기능은 제 경우가 아닙니다.

이 코드를 찾았습니다

 #property copyright "Влад Сергеев для mmgp" 
#property version    "1.00" 
#property strict 
#property script_show_inputs 

input int       orders = 4 ;       //всего ордеров в серии 
input bool      buy = true ;       //флаг разрешающий/запрещающий покупки 
input bool      sell = false ;     //флаг разрешающий/запрещающий продажи 
input int       magic = 100500 ;   //уникальный номер для ордеров, открываемых этим скриптом 
input double    lot = 0.01 ;       //объем каждого ордера серии 
input int       tp = 100 ;         //тейк профит, в пунктах 
input int       sl = 100 ;         //стоп лосс, в пунктах 
input int       slip = 2 ;         //допустимое проскальзывание на открытии, в пунктах (для ECN, где открытие по рынку - игнор) 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {
   int i= 0 ;  // для чего эта переменная
   int ticket= 0 ;
   if (buy) 
     {
       while (i<orders) // здесь эта переменная используется чтобы сравнивать ордера или для чего
        {
         RefreshRates (); // если убрать эту функцию коду хуже не становится
         ticket= OrderSend ( Symbol (), OP_BUY ,lot, NormalizeDouble ( Ask , Digits ),slip, 0 , 0 , "" ,magic, 0 , clrBlue ); //здесь понятно
         if (ticket!=- 1 ) // эта строчка тоже не понятна
           {
             if ( OrderSelect (ticket, SELECT_BY_TICKET , MODE_TRADES ))  // функция для выбора ордера это логично но тоже не понятно как ей пользоваться
              {
               OrderModify (ticket, OrderOpenPrice (), NormalizeDouble ( OrderOpenPrice ()-sl* Point , Digits ), NormalizeDouble ( OrderOpenPrice ()+tp* Point , Digits ), 0 , clrBlue );
               // эту строчку тоже хотел бы чтобы объяснили
              }
           }
         i++; // что увеличивается на оду единицу это относится к магическому номеру ордера чтобы программа понимала что у неё есть ордера
        }
     }
   i= 0 ;
   if (sell) // прошлая запись была для покупак эта для продаж 
     {
       while (i<orders) 
        {
         RefreshRates ();
         ticket= OrderSend ( Symbol (), OP_SELL ,lot, NormalizeDouble ( Bid , Digits ),slip, 0 , 0 , "" ,magic, 0 , clrRed );
         if (ticket!=- 1 ) 
           {
             if ( OrderSelect (ticket, SELECT_BY_TICKET , MODE_TRADES ))  
              {
               OrderModify (ticket, OrderOpenPrice (), NormalizeDouble ( OrderOpenPrice ()+sl* Point , Digits ), NormalizeDouble ( OrderOpenPrice ()-tp* Point , Digits ), 0 , clrRed );
              }
           }
         i++;
        }
     }
  }  
//+------------------------------------------------------------------+

어쩌면 그것은 사용될 수 있습니다. 단지 나에게 선의 의미가 명확하지 않습니다. 내 조건에 맞게 다시 만든 경우 이 코드를 사용할 수 있습니까?

 
Seric29 :

얘들아 제발 말해줘 조건이 한 번 충족되면 어드바이저가 SL을 설정할 수 있는 기능으로 한 번에 3개의 거래를 열도록 어드바이저 코드를 작성하는 방법은 무엇입니까?

여기 내 조건이 있습니다

함수( OrdersTotal () )를 사용하라는 조언을 받았지만 제 경우에는 맞지 않습니다. 나는 그것을 이렇게 썼다.

컴파일된 오류는 없지만 이 기능은 제 경우가 아닙니다.

이 코드를 찾았습니다

어쩌면 나는 줄의 의미를 이해하지 못하는 경우에만 사용할 수 있습니다. 내 조건으로 다시 만든 경우 이 코드를 사용할 수 있습니까?

이렇게 시도

위치=0; //주문 카운터

for(int i=OrdersTotal()-1;i>=0;i--) // 시장가 주문 정렬

{

if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES))continue;//시장에서 선택

{

if (OrderSymbol()!=Symbol()&&OrderMagicNumber()!=Magic) 계속;//EA 주문만 선택(Magic이 있고 모든 통화 쌍에서 거래되는 경우)

포스++; //선택하면 pos를 1씩 증가

}

}

  if (MA_1>MA_2&&pos<3)
  OrderSend ( _Symbol() , OP_BUY ,Lots, Ask , 0 , Ask -SL* Point ,Ask+TP* Point , NULL ,Magic, 0 , clrGreen );
  if (MA_1<MA_2&&pos<3)
  OrderSend ( _Symbol() , OP_SELL ,Lots, Bid , 0 , Bid +SL* Point ,Bid-TP* Point , NULL ,Magic, 0 , clrRed );

 
매우 흥미로운 포럼입니다. 많은 교육 자료!
 
Seric29 :

얘들아 제발 말해줘 조건이 한 번 충족되면 어드바이저가 SL을 설정할 수 있는 기능으로 한 번에 3개의 거래를 열도록 어드바이저 코드를 작성하는 방법은 무엇입니까?

 if (MA_1>MA_2)
     for ( int i= 0 ; i< 3 ; i++)
          tiket = OrderSend ( _Symbol , OP_BUY ,Lots, Ask , 0 , Ask -(i== 0 ?SL_1:i== 1 ?SL_2:SL_3)* Point , Bid +TP* Point , NULL , 0 , 0 , clrGreen );
if (MA_1<MA_2)
     for ( int i= 0 ; i< 3 ; i++)
          tiket = OrderSend ( _Symbol , OP_SELL ,Lots, Bid , 0 , Bid +(i== 0 ?SL_1:i== 1 ?SL_2:SL_3)* Point , Ask -TP* Point , NULL , 0 , 0 , clrRed );