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

 
amsgif80 # :

이것은 내가 넣으려고 한 코드입니다.

이것을 코드 맨 위에 놓으십시오.
열거형 ENUM_DIRECTION{
DIRECTION_BUY = 0, // 구매만
DIRECTION_SELL = 1, // 판매만
DIRECTION_ANY = 2, // 매수 및 매도
};

ENUM_DIRECTION 입력 inp_direction = DIRECTION_ANY; // 허용된 거래 방향


그런 다음 코드에서 구매가 열리는 위치와 판매가 열리는 위치를 찾으십시오. start() 또는 OnTick() 함수 내부에서 찾아야 합니다.
조건에서 구매는 다음을 추가합니다.
if(inp_direction!=DIRECTION_SELL)
판매 위치에 조건을 추가하십시오.
if(inp_direction!=DIRECTION_BUY)

그리고 어디에 넣었어요?
 
MakarFX # :
그리고 어디에 넣었어요?
//+----------------------------------------------- --------------------+
//| 이동 평균.mq5 |
//| Copyright 2009-2013, MetaQuotes Software Corp. |
//+----------------------------------------------- --------------------+





#property copyright "Copyright 2009-2013, MetaQuotes Software Corp."
#속성 링크 " https://www.mql5.com "
#속성 버전 "1.00"

열거형 ENUM_DIRECTION{
DIRECTION_BUY = 0, // 구매만
DIRECTION_SELL = 1, // 판매만
DIRECTION_ANY = 2, // 매수 및 매도
};

ENUM_DIRECTION 입력 inp_direction = DIRECTION_ANY; // 허용된 거래 방향

#include <Trade\Trade.mqh>

입력 이중 MaximumRisk = 0.02; // 최대 위험 비율
입력 더블 DecreaseFactor = 3; // 감소 인자
입력 정수 MovingPeriod = 12; // 이동 평균 기간
입력 int MovingShift = 6; // 이동 평균 이동



//---
intExtHandle=0;


//+----------------------------------------------- --------------------+
//| 전문가 초기화 기능 |
//+----------------------------------------------- --------------------+




int OnInit(무효)
{
//---
ExtHandle=iMA(_Symbol,_Period,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE);
if(ExtHandle==INVALID_HANDLE)
{
printf("MA 표시기 생성 오류");
반환(INIT_FAILED);
}
//---
반환(INIT_SUCCESSED);
}
//+----------------------------------------------- --------------------+
//| 전문가 틱 기능 |
//+----------------------------------------------- --------------------+
무효 OnTick(무효)
{
//---
if(PositionSelect(_Symbol))
CheckForClose();
또 다른
CheckForOpen();
//---
}
//+----------------------------------------------- --------------------+
//| 전문적인 초기화 해제 기능 |
//+----------------------------------------------- --------------------+
무효 OnDeinit(const int 이유)
{
}
//+----------------------------------------------- --------------------+


//+----------------------------------------------- --------------------+
//| 최적 로트 크기 계산 |
//+----------------------------------------------- --------------------+
이중 TradeSizeOptimized(무효)
{
이중 가격 = 0.0;
이중 여백=0.0;
//--- 로트 크기 계산
if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,가격))
반환(0.0);
if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,가격,마진))
반환(0.0);
if(여백<=0.0)
반환(0.0);

더블 로트=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEEMARGIN)*MaximumRisk/margin,2);
//--- 연속 손실 거래의 길이를 계산합니다.
if(감소인자>0)
{
//--- 전체 거래 내역 요청
HistorySelect(0,TimeCurrent());
//--
정수 주문=HistoryDealsTotal(); // 총 거래 수
정수 손실 = 0; // 시리즈에서 손실된 거래의 수

for(int i=orders-1;i>=0;i--)
{
ulong 티켓=HistoryDealGetTicket(i);
if(티켓==0)
{
Print("HistoryDealGetTicket 실패, 거래 내역 없음");
부서지다;
}
//--- 거래 기호 확인
if(HistoryDealGetString(티켓,DEAL_SYMBOL)!=_Symbol)
계속하다;
//--- 이익 확인
이중 이익=HistoryDealGetDouble(티켓,DEAL_PROFIT);
if(이익>0.0)
부서지다;
if(이익<0.0)
손실++;
}
//---
if(손실>1)
lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//--- 허용되는 거래량 값의 정규화 및 확인
더블 스텝볼=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
lot=stepvol*NormalizeDouble(lot/stepvol,0);

이중 minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
if(lot<minvol)
로트=최소권;

이중 maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
if(lot>maxvol)
로트=최대볼륨;
//--- 거래량의 값을 반환
반환(로트);
}


//+----------------------------------------------- --------------------+
//| 오픈 포지션 조건 확인 |
//+----------------------------------------------- --------------------+
무효 CheckForOpen(무효)
{
MqlRates rt[2];
//--- 가격 값 복사
if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
{
Print("CopyRates of ",_Symbol," 실패, 기록 없음");
반품;
}
//--- 새 막대의 첫 번째 눈금에서만 거래
if(rt[1].tick_volume>1)
반품;
//--- 이동 평균 표시기의 현재 값을 가져옵니다.
더블마[1];
if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
{
Print("iMA의 CopyBuffer 실패, 데이터 없음");
반품;
}
//--- 신호 확인
ENUM_ORDER_TYPE 신호=WRONG_VALUE;

if(rt[0].open>ma[0] && rt[0].close<ma[0])
신호=ORDER_TYPE_SELL; // 판매 조건 if(inp_direction!=DIRECTION_BUY)
또 다른
{
if(rt[0].open<ma[0] && rt[0].close>ma[0])
신호=ORDER_TYPE_BUY; // 구매 조건 if(inp_direction!=DIRECTION_SELL)
}
//--- 추가 검사
if(신호!=WRONG_VALUE)
if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
if(막대(_Symbol,_Period)>100)
{
CTrade 무역;
trade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),
SymbolInfoDouble(_Symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),
0.0);
}
//---
}
//+----------------------------------------------- --------------------+
//| 닫기 위치 조건 확인 |
//+----------------------------------------------- --------------------+
무효 CheckForClose(무효)
{
MqlRates rt[2];
//--- 가격 값 복사
if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
{
Print("CopyRates of ",_Symbol," 실패, 기록 없음");
반품;
}
//--- 새 막대의 첫 번째 눈금에서만 거래
if(rt[1].tick_volume>1)
반품;
//--- 이동 평균 표시기의 현재 값을 가져옵니다.
더블마[1];
if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
{
Print("iMA의 CopyBuffer 실패, 데이터 없음");
반품;
}
//--- PositionSelect()를 통해 이전에 선택한 위치 유형을 가져옵니다.
부울 신호=거짓;
긴 유형=PositionGetInteger(POSITION_TYPE);

if(유형==(긴)POSITION_TYPE_BUY && rt[0].open>ma[0] && rt[0].close<ma[0])
신호=참;
if(유형==(긴)POSITION_TYPE_SELL && rt[0].open<ma[0] && rt[0].close>ma[0])
신호=참;
//--- 추가 검사
if(신호)
if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
if(막대(_Symbol,_Period)>100)
{
CTrade 무역;
trade.PositionClose(_Symbol,3);
}
//---
}
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 

이 섹션은 다음과 같아야 합니다.

 //--- проверка сигналов
   ENUM_ORDER_TYPE signal= WRONG_VALUE ;

   if (rt[ 0 ].open>ma[ 0 ] && rt[ 0 ].close<ma[ 0 ])
     {
       if (inp_direction!=DIRECTION_BUY)
         signal= ORDER_TYPE_SELL ;
     }
   else
     {
       if (rt[ 0 ].open<ma[ 0 ] && rt[ 0 ].close>ma[ 0 ])
        {
         if (inp_direction!=DIRECTION_SELL)
            signal= ORDER_TYPE_BUY ;
        }
     }
 //--- дополнительные проверки 
 
MakarFX # :

이 섹션은 다음과 같아야 합니다.

마카르, 여기

       if (inp_direction==DIRECTION_SELL||inp_direction==DIRECTION_ANY)

이것을 교체하는 것이 좋습니다

       if (inp_direction!=DIRECTION_BUY)
 
Alexey Viktorov # :

마카르, 여기

이것을 교체하는 것이 좋습니다

교체)
 
MakarFX # :

이 섹션은 다음과 같아야 합니다.

진심으로 감사드립니다! 모든 것이 즉시 해결되었습니다. 나는 이미 그것을하는 방법에 대해 머리를 깨뜨렸다))

 
그리고 편집기에서 생성된 내 자신의 단순한 조언자에 대해서만 동일한 질문으로 다시 귀하에게 문의할 수 있습니까? 이제 마지막 예제를 직접 처리할 수 있을 거라고 생각했지만 거기에는 없었습니다. 이 구매/판매 코드를 삽입할 위치를 알 수 없습니다.
 
amsgif80 # :
그리고 편집기에서 생성된 내 자신의 단순한 조언자에 대해서만 동일한 질문으로 다시 귀하에게 문의할 수 있습니까? 이제 마지막 예제를 직접 처리할 수 있을 거라고 생각했지만 거기에는 없었습니다. 이 구매/판매 코드를 삽입할 위치를 알 수 없습니다.
보여주다
 
amsgif80 # :

포럼에 코드를 삽입하는 방법을 보여주었습니다.


 
MakarFX # :

당신은 아무것도 변경하지 않았습니다

당신의 호소

안에 있다

팁 감사합니다.