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

 
Vitalie Postolache :
오류는 주문 선택 영역의 코드 어딘가에 있습니다.
예, 나머지는 만지지 않습니다.
 
spoiltboy :
예, 나머지는 만지지 않습니다.
어떤 경우든 조건부 줄 뿐만 아니라 앞 뒤 코드를 봐야 합니다.
 
Artyom Trishkin :
어떤 경우든 조건부 줄 뿐만 아니라 앞 뒤 코드를 봐야 합니다.
extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, 막대=10; 외부 이중 lotB=0.1, lotS=0.1;
이중 slB, tpB, slS, tpS; 이중 x=0, z=0;


무효 OnTick()
{
이중 maxpr1=-9999; 이중 minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{더블 i=iHigh(Symbol(), PERIOD_CURRENT , shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<막대; shiftA1++)
{더블 y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}

if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointssl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, 빨간색);
if (티켓UP==-1) Print("오류 OP_BUY"); else Print("OP_BUY OK");}

if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, 파란색);
if (티켓D==-1) Print("오류 OP_SELL"); else Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1; 주문삭제(티켓D);}
if (z!=minpr1){z=minpr1; 주문삭제(티켓업);}


이중 maxpr=-9999; 이중 최소값 = 9999;

for(int shift=0; shift<bars; shift++)
{더블 e=iHigh(Symbol(), PERIOD_CURRENT, 시프트);
if (e>maxpr){maxpr=e;}}

for(int shiftA=0; shiftA<막대; shiftA++)
{더블 r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}}

문자열
if(막대==1)a="막대: ";
else a= IntegerToString(bars,1) + " 막대: ";
Comment("마지막 ", a, "max", DoubleToStr(maxpr, 5), ", min ", DoubleToStr(minpr, 5),");
}

int BuyLimitCount(){
정수 수 = 0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(주문 선택(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(주문 유형()==OP_BUYLIMIT)
count++;}}}반환(카운트);}

int BuyCount(){
정수 수 = 0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(주문 선택(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(주문 유형()==OP_BUY)
count++;}}}반환(카운트);}

int SellLimitCount(){
정수 수 = 0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(주문 선택(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(주문 유형()==OP_SELLLIMIT)
count++;}}}반환(카운트);}

int SellCount(){
정수 수 = 0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(주문 선택(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(주문 유형()==OP_SELL)
count++;}}}반환(카운트);}
 
spoiltboy :
...
일반적으로 이 코드로 무엇을 하려는 건가요? 실례합니다. 소름 끼치는 코드입니다.
 
spoiltboy :

SRC 의 도움으로 코드를 조합하고 정상적으로 삽입하는 것이 운명이 아닙니까?

삭제를 시도하기 전에 OrderSelect를 사용 하지 않는 이유는 무엇입니까?

 
spoiltboy :
...

하나 의 주문과 위치 수에 대한 구조의 필수 필드를 채울 수 있는데 왜 그렇게 많은 사이클이 필요한지 명확하지 않습니다.

과잉을 제거하고 제거도 제거했습니다. 티켓으로 삭제할 필요는 없지만(삭제하기 전에 여전히 알아야 함), 주기에서 인덱스별로 원하는 순서를 찾아 삭제합니다.

그래서 조건이 생겼을 때 호출해야 하는 주문을 검색하고 삭제하는 함수가 하나 더 필요 하지만, 당신의 코드를 보고 바로 이해할 시간이 없었고 알아낼 시간이 없었습니다. 필요한 조건을 글로 적어주시면 삭제 방법을 알려드리겠습니다.

보지 않고 무릎을 꿇고 글을 작성하다 보니 구조에 주문수와 포지션을 채우는 기능에 막힌 부분이 있을 수 있으니 확인은 하지 않았습니다.

//--- input variables
input      double    LotB= 0.1 ;       // Лот Buy
input      double    LotS= 0.1 ;       // Лот Sell
input      int       Pointsl= 100 ;   // StopLoss в пунктах
input      int       Pointtp= 100 ;   // TakeProfit в пунктах
input      int       NumBars= 10 ;     // Количество баров для поиска Max/Min
input      int       Magic= 100500 ;   // Magic

//--- global variables
struct DataNumOrders
  {
   int buy;           // Количество позиций Buy
   int sell;         // Количество позиций Sell
   int buy_limit;     // Количество ордеров BuyLimit
   int buy_stop;     // Количество ордеров BuyStop
   int sell_limit;   // Количество ордеров SellLimit
   int sell_stop;     // Количество ордеров SellStop
  };
DataNumOrders numOrders;   // Количество ордеров
double lotB, lotS;
int     pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   numBars=(NumBars< 1 ? 1 :NumBars> Bars ? Bars :NumBars);
   pointsl=(Pointsl< 0 ? 0 :Pointsl);
   pointtp=(Pointtp< 0 ? 0 :Pointtp);
   double minLot= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MIN );
   double maxLot= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MAX );
   lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
   lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   //--- заполним структуру количеством ордеров и позиций
   GetNumOrders( Symbol (),Magic,numOrders);
  
   //--- найдём максимальную и минимальную цены за bars свечей
   double maxPrice= 0.0 ; double minPrice= DBL_MAX ;
   for ( int i= 0 ; i<numBars; i++) {
       double max_i= iHigh ( Symbol (), PERIOD_CURRENT ,i);
       if (max_i>maxPrice) maxPrice=max_i;
       double min_i= iLow ( Symbol (), PERIOD_CURRENT ,i);
       if (min_i<minPrice) minPrice=min_i;
      }

   //--- выставим BuyLimit
   if (numOrders.buy_limit== 0 && numOrders.buy== 0 ) {
       double slB=(pointsl== 0 ? 0 : NormalizeDouble (minPrice-pointsl* Point (), Digits ()));
       double tpB=(pointtp== 0 ? 0 : NormalizeDouble (minPrice+pointtp* Point (), Digits ()));
       int ticketUP= OrderSend ( Symbol (), OP_BUYLIMIT , lotB, minPrice, 3 , slB, tpB, "" , Magic, 0 , clrRed );
       if (ticketUP==- 1 ) Print ( "ERROR OP_BUY" );
       else Print ( "OP_BUY OK" );
      }
   //--- выставим SellLimit
   if (numOrders.buy_limit== 0 && numOrders.sell== 0 ) {
       double slS=(pointsl== 0 ? 0 : NormalizeDouble (maxPrice+pointsl* Point (), Digits ()));
       double tpS=(pointtp== 0 ? 0 : NormalizeDouble (maxPrice-pointtp* Point (), Digits ()));
       int ticketD= OrderSend ( Symbol (), OP_SELLLIMIT , lotS, maxPrice, 3 , slS, tpS, "" , Magic, 0 , clrBlue );
       if (ticketD==- 1 ) Print ( "ERROR OP_SELL" );
       else Print ( "OP_SELL OK" );
      }

   //--- Тут должно быть удаление, но не понятно при каких условиях. Опишите их
  
  
   //---
   string a=(numBars== 1 )? "bar: " : IntegerToString (numBars, 1 )+ " bar's: " ;
   Comment ( "Last " , a, "max " , DoubleToStr (maxPrice, Digits ()), ", min " , DoubleToStr (minPrice, Digits ()), "." );
  }
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров   |
//+------------------------------------------------------------------+
void GetNumOrders( string symbol_name, int magic_number, DataNumOrders &number_of) {
   ZeroMemory (number_of);
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS )) {
         if ( OrderMagicNumber ()!=magic_number) continue ;
         if ( OrderSymbol ()!=symbol_name)       continue ;
         if ( OrderType ()== OP_BUY )       number_of.buy++;
         if ( OrderType ()== OP_BUYLIMIT )  number_of.buy_limit++;
         if ( OrderType ()== OP_BUYSTOP )   number_of.buy_stop++;
         if ( OrderType ()== OP_SELL )      number_of.sell++;
         if ( OrderType ()== OP_SELLLIMIT ) number_of.sell_limit++;
         if ( OrderType ()== OP_SELLSTOP )  number_of.sell_stop++;
         }
      }
}
//+------------------------------------------------------------------+
 
Artyom Trishkin :
일반적으로 이 코드로 무엇을 하려는 건가요? 실례합니다. 소름 끼치는 코드입니다.
EA는 마지막 X 막대의 최소값과 최대값을 계산하고 주문합니다. 또한, 최대값이 감소하거나 최소값이 증가하면 해당 주문을 삭제하고 새 데이터를 사용하여 열어야 합니다.


 

다음을 작성하는 방법:

만약 가격이 1% 변했다 면, 그날의 OPEN이 그 날의 Close보다 1% 더 많다고 합시다.

 
Movlat Baghiyev :

다음을 작성하는 방법:

만약 가격이 1% 변했다면, 그날의 OPEN이 그 날의 Close보다 1% 더 많다고 합시다.

글쎄, 그것은 또 다른 문제입니다. 이제 1%가 무엇에 상대적인지 분명합니다.)

if ( Open [x] > Close [x]+ Open [x]* 0.01 ) {code}
 
spoiltboy :
EA는 마지막 X 막대의 최소값과 최대값을 계산하고 주문합니다. 또한, 최대값이 감소하거나 최소값이 증가하면 해당 주문을 삭제하고 새 데이터를 사용하여 열어야 합니다.


설정 가격을 수정할 수 있을 때 삭제하고 새 수준에 대한 상대적인 테이크를 중단하는 이유는 무엇입니까? 결국, 예금이 없고 시장 포지션이 없는 경우에만 예금을 설정했습니다. 이는 다음을 의미합니다. 시장에 보류 중인 주문 이 있고 해당하는 시장 포지션이 없는 경우 보류 중인 주문의 가격을 수정하면 됩니다. 새로운 수준.

매번 최대 및 최소 발견 가격을 기억하십시오. 현재 발견된 최대 가격이 이전 가격보다 낮으면 보류 중인 BuyLimit을 수정하고 새 최대 가격을 저장합니다. 가격 Min - 미러.