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

 
 int x= 0 ;
  int scale_mas[ 13 ]={ 0 , 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 , 512 , 1024 , 2048 , 4096 };//объявление массива

 for ( int i= 0 ;i < ArraySize (scale_mas);i++){
    if (x == scale_mas[ 0 ])x = scale_mas[ 1 ];                       //если х=индекс0, то х=индекс1
     if (x >= ArraySize (scale_mas))x = scale_mas[ 11 ];              //если х>= размер массива, то х=индекс11
    i=x;
    if ( ObjectGetInteger ( 0 , "Button+" , OBJPROP_STATE ) == false ){   //если кнопка "+" нажата
       i=i+ 1 ;                                                    //увеличиваем индекс на 1
        ObjectSetInteger ( 0 , "Button+" , OBJPROP_STATE , true );}
                        
    x=i;							 //присваиваем х значение последнего индекса
    if ( ObjectGetInteger ( 0 , "Button-" , OBJPROP_STATE ) == false ){   //если кнопка "-" нажата
       i=i- 1 ;                                                    //уменьшаем индекс на 1
     ObjectSetInteger ( 0 , "Button-" , OBJPROP_STATE , true );}
                            
    x=i;                                                         //присваиваем х значение последнего индекса
 ObjectSetString ( 0 , "=TrendLine" , OBJPROP_TEXT ,scale_mas[x]);}}    //выводим результат scale_mas[x]
어제 코드를 작성했는데 제대로 작동하는 것 같지만 더하기 버튼으로 배열의 극한 값에 도달했을 때만 배열의 시작 부분으로 재설정되고 다시 위로 이동합니다. 배열의 최상위 값에 도달할 때 더하기 버튼을 더 클릭하면 최상위 인덱스에서 멈추고 배열의 맨 아래로 재설정되지 않도록 코드에서 무엇을 추가하거나 수정할 수 있습니까? 아니면 버튼 클릭으로 이 아이디어를 구현하기 위해 코드를 어떻게든 단순화할 수 있습니까?
 
Ivan Revedzhuk :
어제 코드를 작성했는데 제대로 작동하는 것 같지만 더하기 버튼으로 배열의 극한 값에 도달했을 때만 배열의 시작 부분으로 재설정되고 다시 위로 이동합니다. 배열의 최상위 값에 도달할 때 더하기 버튼을 더 클릭하면 최상위 인덱스에서 멈추고 배열의 맨 아래로 재설정되지 않도록 코드에서 무엇을 추가하거나 수정할 수 있습니까? 아니면 버튼 클릭으로 이 아이디어를 구현하기 위해 코드를 어떻게든 단순화할 수 있습니까?
 if (x >= ArraySize (scale_mas))
 ArraySize (scale_mas)-1;              //если х>= размер массива, то ....

아마 그렇게 될 것입니다.

 
Alexey Viktorov :

아마 그렇게 될 것입니다.

그것도 시도, 동일하게 작동

 
Ivan Revedzhuk :

그것도 시도, 동일하게 작동

나는 즉시 눈치 채지 못했지만 왜 사이클이 있습니까?

 
Alexey Viktorov :

나는 즉시 눈치 채지 못했지만 왜 사이클이 있습니까?

그것 없이 어떻게 가능합니까? 내가 어떻게 최선을 다하는지 모르고 논리에 따라 생각하는 대로 할 뿐입니다.

 
Ivan Revedzhuk :

그것 없이 어떻게 가능합니까? 내가 얼마나 최선을 다하는지 모르고 논리에 따라 생각하는 대로 할 뿐입니다.

글쎄요, 논리가 달라야 합니다. 배열의 인덱스인 + 버튼을 눌렀다. 최대값에 도달하면 증가하지 않지만 최대값으로 유지됩니다. 버튼을 눌렀습니다 - 지수가 감소했습니다. 0에 도달하고 누름에 응답하지 않으며 인덱스 0에 유지됩니다.

아니면 다른 생각이 있었나요?

추신; 그리고 이 질문에 대한 답변으로 플래그 작업 예제를 게시하고 삭제한 사람은 누구입니까? 삭제된 이유는 무엇입니까? 결국 이것은 사람에게 정말 좋은 결정입니다. 왜 제한된 배열이 필요한가요???
 
Alexey Viktorov :

글쎄요, 논리가 달라야 합니다. 배열의 인덱스인 + 버튼을 눌렀다. 최대값에 도달하면 증가하지 않지만 최대값으로 유지됩니다. 버튼을 눌렀습니다 - 지수가 감소했습니다. 0에 도달하면 누르기에 응답하지 않고 인덱스 0에 유지됩니다.

아니면 다른 생각이 있었나요?

추신; 그리고 이 질문에 대한 답변으로 플래그 작업 예제를 게시하고 삭제한 사람은 누구입니까? 삭제된 이유는 무엇입니까? 결국 이것은 사람에게 정말 좋은 결정입니다. 왜 제한된 배열이 필요한가요???

아니, 바로 그 생각이었다. 어떻게 하는 것이 맞는지 잘 모르겠어서 그냥 있는 그대로 했습니다. 그러나 프로그램에서 루프가 실행 중일 때 차트의 버튼을 클릭하여 루프를 클릭할 때까지 다른 모든 것이 작동하지 않는다는 것을 알았습니다. 모든 것이 정지된 것과 같습니다. 왜 이런 일이 발생하는지 명확하지 않습니다. 어떻게 든 아이디어를 다른 방식으로 구현할 수있는 옵션이 있다면 감사하겠습니다 ...

 

모든 것. 문제를 해결했습니다) 배열 및 기타 기타 사항없이. 훨씬 쉬워졌습니다)))

두 번째 질문은 익었습니다. 마우스를 사용하여 상황에 맞는 메뉴를 통해 경고를 설정할 때 나타나는 화살표 설정을 사용하여 코드에서 경고 트리거 수준을 설정하려면 어떻게 해야 합니까?

경고 질문입니다.

 

도와주세요, 이 어드바이저에 기능을 추가하여 EURUSD 창에 설치된 어드바이저가 동일한 개시 매개변수로 동시에 거래를 열 수 있지만 GBPUSD에 대해서는 열리지 않지만 EURUSD에는 열리지 않도록 할 수 있습니다.

//+----------------------------------------------- -------------------------------------------------- ------------------------------------------------+

//| 개발자: Andrey Minaev |

//| 전문가 고문: Stochastic.mq4 |

//| 웹사이트: safe-forex.ru |

//| 메일: minaev.work@mail.ru |

//| 스카이프: 라이브:minaev.work |

//+----------------------------------------------- -------------------------------------------------- ------------------------------------------------+

#property copyright "Safe-Forex.ru"

#속성 링크 "https://safe-forex.ru"

#속성엄격


extern bool Use_Symbol1 = true;

외부 문자열 Symbol1 = "USDJPY";


입력 문자열 설정 = ""; // 어드바이저 설정

입력 정수 마법 = 111; // 마법

입력 이중 고정 볼륨 = 0.01; // 용량

입력 int takeProfit = 500; // 이익

입력 정수 stopLoss = 500; // 상실

int 구매 레벨 = 100을 입력하십시오. // 25 구매 레벨

입력 int 판매 레벨 = 0; // 75 판매 레벨


extern int ADXperiod=15; //ADX 기간 15

외부 intADXLevel=1;


외부 intMAperiod=360; //MA 기간 80

외부 정수 MAperiod_2 = 360; //MA 기간 80



입력 문자열 stochSettings = ""; // 스토캐스틱 오실레이터 표시기 설정

입력 정수 stochPeriodK = 5; // 기간 %K

입력 정수 stochPeriodD = 3; // 기간 %D

입력 정수 stochSlowing = 3; // 천천히 해

ENUM_STO_PRICE 입력 stochPrice = STO_LOWHIGH; // 가격

ENUM_MA_METHOD 입력 stochMethod = MODE_SMA; // 방법


날짜 시간 newCandle; // 현재 차트의 새 캔들

bool allowOpenBuy, // 매수 포지션을 열 수 있는 권한

허용오픈셀; // 매도 포지션을 열 수 있는 권한

//+----------------------------------------------- -------------------------------------------------- ------------------------------------------------+

int OnInit(무효)

{

INIT_SUCCESSED 반환;

}

//+----------------------------------------------- -------------------------------------------------- ------------------------------------------------+

무효 OnDeinit(const int 이유)

{

}

//+----------------------------------------------- -------------------------------------------------- ------------------------------------------------+

무효 OnTick(무효)

{

if(newCandle!=시간[0]) CheckSignalExist(); newCandle=시간[0];

if(allowOpenBuy) 오픈포지션(OP_BUY);

if(allowOpenSell) 오픈포지션(OP_SELL);

}

//+----------------------------------------------- -------------------------------------------------- ------------------------------------------------+

//| 함수는 현재 가격에서 포지션을 엽니다 |

//+----------------------------------------------- -------------------------------------------------- ------------------------------------------------+

무효 OpenPosition(int 유형)

{


이중 가격 = 0.0;

if(유형==OP_BUY) 가격=묻기;

if(유형==OP_SELL) 가격=입찰가;

int ticket=OrderSend(_Symbol,type,fixVolume,price,0,0,0,"",magic,0);

// int ticket=OrderSend(,type,fixVolume,price,0,0,0,"",magic,0);

수면(1000);

if(티켓>0)

{

if(유형==OP_BUY)

{

Print("매수 포지션 오픈, 티켓: ",티켓);

allowOpenBuy=거짓;

// SetStopOrders(티켓);

}

if(유형==OP_SELL)

{

Print("매도 포지션 오픈, 티켓: ",티켓);

allowOpenSell=거짓;

// SetStopOrders(티켓);

}

}

if(티켓<0)

{

if(type==OP_BUY) Print("매수 위치가 열리지 않았습니다, 오류: ",GetLastError());

if(type==OP_SELL) Print("판매 위치가 열리지 않았습니다, 오류: ",GetLastError());

}

}

//+----------------------------------------------- -------------------------------------------------- ------------------------------------------------+

//| 기능은 정지 주문을 설정합니다 |

//+----------------------------------------------- -------------------------------------------------- ------------------------------------------------+

// 무효 SetStopOrders(int 티켓)

//{

// 더블 stopLevel=MarketInfo(_Symbol,MODE_STOPLEVEL),

// 퍼짐 =MarketInfo(_Symbol,MODE_SPREAD),

// tp = 이익을 취하십시오,

// sl=스톱로스;

// stopLevel+=확산;

// if(tp<stopLevel)

// {

// tp=스톱레벨;

// Print("최소 수익 거리 설정");

// }

// if(sl<stopLevel)

// {

// sl=스톱레벨;

// Print("최소 손실 거리가 설정되었습니다.");

// }

// if(OrderSelect(티켓,SELECT_BY_TICKET))

// {

// int type=OrderType();

// 이중 opp =OrderOpenPrice();

// if(type==OP_BUY) {tp=opp+tp*_Point; sl=opp-sl*_포인트;}

// if(type==OP_SELL) {tp=opp-tp*_Point; sl=op+sl*_포인트;}

// if(OrderModify(티켓, opp, sl, tp, 0))

// {

// if(type==OP_BUY) Print("매수 포지션에 대한 손익 수준이 설정되었습니다. 티켓: ",티켓);

// if(type==OP_SELL) Print("매도 포지션에 대한 손익 수준이 설정되었습니다. 티켓: ",티켓);

// }

// 또 다른 {

// if(type==OP_BUY) Print("구매 위치에 대한 손익 수준이 설정되지 않았습니다. 티켓: ",ticket,", error: ",GetLastError());

// if(type==OP_SELL) Print("판매 포지션에 대한 손익 수준이 설정되지 않았습니다. 티켓: ",ticket,", error: ",GetLastError());

// }

// }

//}

//+----------------------------------------------- -------------------------------------------------- ------------------------------------------------+

//| 함수는 신호를 확인합니다 |

//+----------------------------------------------- -------------------------------------------------- ------------------------------------------------+

무효 CheckSignalExist(무효)


{

이중 ADX1=iADX(Symbol(),Period(),ADXperiod,0,MODE_MAIN,1); ///////////////////////////////

이중 ADX2=iADX(Symbol(),Period(),ADXperiod,0,MODE_MAIN,2);

더블 DPLUS=iADX(Symbol(),Period(),ADXperiod,0,MODE_PLUSDI,1);

더블 DMINUS=iADX(Symbol(),Period(),ADXperiod,0,MODE_MINUSDI,1);

이중 MA=iMA(Symbol(),Period(),MAperiod,0,MODE_SMA,0,1);

이중 MA_2=iMA(Symbol(),Period(),MAperiod_2,0,MODE_SMA,0,1);


//PERIOD_H1

이중 mainLine1=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_MAIN,1),

mainLine2=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_MAIN,2),

signLine1=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_SIGNAL,1),

signLine2=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_SIGNAL,2);

Comment(" ", (매도-입찰)/1.5," ", 입찰-종료[1]," ", 매도-종가[1]);

// if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel

// && iClose(Symbol(),Period(),1)>MA&& iClose(Symbol(),Period(),1)>MA_2 && signLine1<buyLevel && signLine2<buyLevel

if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel

// &&닫기[2]<MA&& 닫기[2]<MA_2 && signLine1<buyLevel && signLine2<buyLevel

닫기(&C)[10] > 닫기[1]-(닫기[1]-닫기[20])

닫기(&&)[10]>입찰가)

{

Print("매수 포지션을 열라는 신호가 있습니다.");

if(GetPositionsNumber()==0)

{

// allowOpenSell=true;

allowOpenBuy=참;

수면(1000);

Print("매수 포지션을 열 수 있습니다.");

}

}

// if(mainLine1<signLine1 && mainLine2>signLine2 && mainLine1>sellLevel && ADX1>ADXLevel&& mainLine2>sellLevel

// && iClose(Symbol(),Period(),1)<MA&& iClose(Symbol(),Period(),1)<MA_2 && signLine1>sellLevel && signLine2>sellLevel

if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel

// &&닫기[2]>MA&& 닫기[2]>MA_2 && signLine1<buyLevel && signLine2<buyLevel

닫기(&C)[10] < 닫기[1]+(닫기[20]-닫기[1])

닫기(&&)[10]<문의)

{

Print("매도 포지션을 열라는 신호가 있습니다.");

if(GetPositionsNumber()==0)

{

//allowOpenBuy=참;

allowOpenSell=참;

수면(1000);

Print("매도 포지션을 열 수 있습니다.");

}

}

}
















////////////////////////////////////////////



//+----------------------------------------------- -------------------------------------------------- ------------------------------------------------+

//| 함수는 열린 위치의 수를 반환합니다 |

//+----------------------------------------------- -------------------------------------------------- ------------------------------------------------+







int GetPositionsNumber(무효)

{

정수 = 0;

for(int i=0; i<OrdersTotal(); i++)

if(주문선택(i,SELECT_BY_POS))

if(OrderSymbol()==_Symbol && OrderMagicNumber()==마법)

숫자++;

반환 번호;

}

//+----------------------------------------------- -------------------------------------------------- --------------------------------

 
vvs1 :

도와주세요, 이 어드바이저에 그러한 기능을 추가하는 것이 가능합니다. 그래서 EURUSD 창에 설치된 어드바이저가 동일한 개시 매개변수로 동시에 거래를 열 수 있지만 GBPUSD에 대해서는 열리지 않지만 EURUSD에는 열리지 않습니다.

실례합니다, 머리는 괜찮으세요? 코드가 한곳에 꽂혔을 뿐만 아니라 주석 처리된 줄도 지우지 않고 빈 줄을 엄청나게 많이 남겼습니다.

당신이 도움을 요청하는 사람들을 존중해야 한다고 생각하지 않습니까???

사유: