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

 

@Artyom Trishkin @Konstantin Nikitin

알려주십시오. int start를 통해 void NOTIFICATION() 함수를 폴링하는 것이 맞습니까? 일정한 주기가 있습니다! 이 논리를 바로 시작하는 것이 더 논리적일까요? 쓰레기를 버리지 않고 적재하지 않기 위해! 그리고 제가 직접 읽어보면 더 재미있을 것 같아서 글을 썼어요!

 
Rewerpool :

@Artyom Trishkin @Konstantin Nikitin

알려주십시오. int start를 통해 void NOTIFICATION() 함수를 폴링하는 것이 맞습니까? 일정한 주기가 있습니다! 이 논리를 바로 시작하는 것이 더 논리적일까요?

OnTick()을 사용합니다. 그것은 모두 필요한 논리에 달려 있습니다.
 
이거 어디에 넣어야 하는지 알려주실 수 있나요? //+----------------------------------------------- --------------------+
 //|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
bool CheckVolumeValue( double volume, string & description )
  {
//--- минимально допустимый объем для торговых операций
   double min_volume= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MIN );
   if (volume<min_volume)
     {
       description = StringFormat ( "Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f" ,min_volume);
       return ( false );
     }

//--- максимально допустимый объем для торговых операций
   double max_volume= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MAX );
   if (volume>max_volume)
     {
       description = StringFormat ( "Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f" ,max_volume);
       return ( false );
     }

//--- получим минимальную градацию объема
   double volume_step= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_STEP );

   int ratio=( int ) MathRound (volume/volume_step);
   if ( MathAbs (ratio*volume_step-volume)> 0.0000001 )
     {
       description = StringFormat ( "Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f" ,
                               volume_step,ratio*volume_step);
       return ( false );
     }
   description = "Корректное значение объема" ;
   return ( true );
  }
 

고문 코드


열거형
{
e=1, // 포물선 표시기 기준
};
열거형 tf
{
af=0, // 현재
bf=1, // 1분
cf=2, // 5분
df=3, // 15분
ef=4, // 30분
ff=5, // 1시간
gf=6, // 4시간
hf=7, // 1일
};

extern int 매직 = 123654789;
extern int 미끄러짐 = 0;
입력 더블 로트 = 1;
외부 int rsi_period = 14;
외부 int rsi_high = 50;
정수 rsi_price = PRICE_CLOSE;
외부 int rsi_low = 50;
int loss_stop = 5000;
extern int take_profit = 5000;
이중 sar_step = 0.03;
이중 sar_max = 0.03;

int GeneralNoLoss = 거짓; // 손익분기점에서 추적
정수 매개변수_후행 = e; // 트롤 메소드
int StartTrall = -5000; // 최소 후행 이익(포인트)
int 스텝트럴 = 1; // 정지 손실 이동 단계
입력 tf TF_Tralling = af; // 표시기 타임프레임(0-현재)
외부 정수 델타 = 50; // 계산된 손절매 수준에서 오프셋

이중 단계 = 0.03; //포물선 단계(방법 4)
이중 최대값 = 0.03; //포물선 최대값(방법 4)


색상 text_color = 라임; // 정보 출력 색상

이중 ma, rsi, sar_1, sar_2, ma_1, ma_2, ma_3, ma_4, ma_5, ma_6;
날짜 시간 LastBuyTime, LastSellTime;

정수 STOPLEVEL;
정수 TF[10]={0,1,5,15,30,60,240,1440,10080,43200};
이중 SLB=0,SLS=0;


int OnInit()

{
//---

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

무효 OnTick(){
STOPLEVEL=(int)MarketInfo(Symbol(),MODE_STOPLEVEL);

정수 b=0,s=0;
이중 OOP, price_b=0, price_s=0, lot=0,NLb=0,NLs=0,LS=0,LB=0;
int 팁, 티켓;
부울 오류;
더블 SL, OSL;
정수 = 0;
(b==0) SLB=0인 경우;
(s==0) SLS=0인 경우;
for (int i=OrdersTotal(); i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
팁 = 주문 유형();
if (tip<2 && (OrderSymbol()==Symbol()) && (OrderMagicNumber()==Magic))
{
OSL = OrderStopLoss();
OOP = OrderOpenPrice();
티켓 = OrderTicket();
엔++;
if (팁==OP_BUY)
{
if(일반 손실 없음)
{
SL = SlLastBar(OP_BUY, 입찰가, NLb);
if (SL < NLb+StartTall*Point) 계속;
}
또 다른
{
SL = SlLastBar(OP_BUY, 입찰가, OOP);
if (SL < OOP+StartTall*Point) 계속;
}
//if (OSL >= OOP && only_NoLoss) 계속;
if (SL >= OSL + StepTall*Point && (Bid-SL)/Point>STOPLEVEL)
{
error=OrderModify(티켓,OOP,SL,OrderTakeProfit(),0,흰색);
if (!error) Comment("TrailingStop Error ",GetLastError()," order ",Ticket," SL ",SL);
else Comment("TrailingStop ",티켓," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
}
}
if (팁==OP_SELL)
{
if(일반 손실 없음)
{
SL = SlLastBar(OP_SELL,문의,NL);
if (SL > NLs-StartTall*Point) 계속;
}
또 다른
{
SL = SlLastBar(OP_SELL, 물어보기, OOP);
if (SL > OOP-StartTall*Point) 계속;
}
//if (OSL <= OOP && only_NoLoss) 계속;
if ((SL <= OSL-StepTall*Point || OSL==0) && (SL-Ask)/Point>STOPLEVEL)
{
error=OrderModify(티켓,OOP,SL,OrderTakeProfit(),0,흰색);
if (!error) Comment("TrailingStop Error ",GetLastError()," order ",Ticket," SL ",SL);
else Comment("TrailingStop ",티켓," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
}
}
}
}
}
ma = iMA(기호(), 0, 70, 0, MODE_SMA, PRICE_CLOSE, 1);
rsi = iRSI(Symbol(), 0, rsi_period, rsi_price, 1);
sar_1 = iSAR(기호(), 0, sar_step, sar_max, 1);
sar_2 = iSAR(기호(), 0, sar_step, sar_max, 2);


만약 ((hhhhhhhhhh))
{
LastBuyTime = 시간[0];
if(OrderSend(Symbol(), OP_BUY, lot, NormalizeDouble(Ask,Digits), Slippage, Ask - loss_stop*Point, Ask + take_profit*Point, "주문", Magic, 0, clrGreen) > 0){
Print("구매 주문이 전송되었습니다!");
반품;
}else Print("구매 주문 오류");
}
만약 ((hhhhhhhhhhhhhhhh))
{
LastSellTime = 시간[0];
if(OrderSend(Symbol(), OP_SELL, lot, NormalizeDouble(Bid, Digits), Slippage, Bid + loss_stop*Point, Bid - take_profit*Point, "Order", Magic, 0, clrRed) > 0)
{
Print("판매 주문이 발송되었습니다!");
반품;
}else Print("판매 주문 오류");
}
}

//------------------------------------------------ --------------------
이중 SlLastBar(int 팁, 이중 가격, 이중 OOP)
{
이중 값 = 0;
스위치(parameters_trailing)
{
사례 1: // Parabolic 표시자에 의해
prc = iSAR(Symbol(),TF[TF_Tralling],Step,Maximum,0);
if (팁==OP_BUY)
{
prc = NormalizeDouble(prc - 델타*포인트, 숫자);
if(가격-STOPLEVEL*포인트 < prc) prc=0;
ARROW("cm_SL_Buy", prc, 4, clrAqua);
}
if (팁==OP_SELL)
{
prc = NormalizeDouble(prc + delta*Point,Digits);
if(price+STOPLEVEL*Point > prc) prc=0;
ARROW("cm_SL_Sell", prc, 4, clrRed);
}
부서지다;
}
반환(prc);
}

//------------------------------------------------ --------------------
문자열 StrPer(int 당)
{
if (per == 0) per=Period();
if (== 1 당) return("M1");
if (== 5당) return("M5");
if (per == 15) return("M15");
if (당 == 30) return("M30");
if (per == 60) return("H1");
if (per == 240) return("H4");
if (== 1440당) return("D1");
if (== 10080 당) return("W1");
if (per == 43200) return("MN1");
return("마침표 오류");
}
//+----------------------------------------------- --------------------+
void ARROW(문자열 이름, 이중 가격, int ARROWCODE, 색상 c)
{
개체삭제(이름);
ObjectCreate(이름, OBJ_ARROW ,0,시간[0],가격,0,0,0,0);
ObjectSetInteger(0,이름,OBJPROP_ARROWCODE,ARROWCODE);
ObjectSetInteger(0,이름,OBJPROP_SELECTABLE,거짓);
ObjectSetInteger(0,이름,OBJPROP_SELECTED,거짓);
ObjectSetInteger(0, 이름, OBJPROP_COLOR, c);
ObjectSetInteger(0,이름,OBJPROP_WIDTH, 1);
}
//------------------------------------------------ --------------------
색상 색상(bool P,색상 a,색상 b)
{
if (P) return(a);
반환(b);
}
//------------------------------------------------ --------------------

 
Vladimir Ozharovskiy :
이거 어디에 넣어야 하는지 알려주실 수 있나요? //+----------------------------------------------- --------------------+

글쎄요....그렇게 중요하다면

이 작업을 수행:

 //+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+

멋진..)))

 
Alekseu Fedotov :

글쎄요....그렇게 중요하다면

이 작업을 수행:

멋진..)))

근데 진지하게?)

 
Vladimir Ozharovskiy :

근데 진지하게?)

기능 자체에 대해 이야기하는 경우 프로그램의 맨 끝에 복사하여 붙여넣으십시오.

void OnTick() 함수 외부에 필요

 
Vladimir Ozharovskiy :

근데 진지하게?)

내가 알기로는 이 기능은 경매에 참여하지 않고 설명 을 확인하고 보고한다.

 
Alekseu Fedotov :

기능 자체에 대해 이야기하는 경우 프로그램의 맨 끝에 복사하여 붙여넣으십시오.

void OnTick() 함수 외부에 필요

그러면 사람이 할 일은 무엇입니까? 당신은 여전히 그녀를 올바르게 불러야합니다!

 
도움이 될 것 같습니다.. 감사합니다!