코딩 도움말 - 페이지 242

 
Mastercash:
누군가 내가 무엇을 잘못했는지 말해 줄 수 있습니까? 아래 코드는 경고와 함께 2 EMA 교차입니다. 작동을 거부합니다. Pls는 mt4 빌드 600 +에서 컴파일하고 작업하는 데 도움을 줄 수 있습니다.

#재산권 "wnk"

#속성 링크 "www.wnk.com"

#속성 표시기_차트_창

#속성 표시기_버퍼 2

#property indicator_color1 라임

#property indicator_color2 빨간색

//--- 버퍼

이중 ExtMapBuffer1[];

이중 ExtMapBuffer2[];

//외부변수......

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

//| 커스텀 인디케이터 초기화 기능 |

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

정수 초기화()

{

//---- 표시기

SetIndexStyle(0,DRAW_ARROW);

SetIndexArrow(0,217);

SetIndexBuffer(0,ExtMapBuffer1);

SetIndexEmptyValue(0,0.0);

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(1,217);

SetIndexBuffer(1,ExtMapBuffer2);

SetIndexEmptyValue(1,0.0);

//----

리턴(0);

}

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

//| 커스텀 인디케이터 초기화 해제 기능 |

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

정수 초기화()

{

//----

//----

리턴(0);

}

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

//| 사용자 지정 표시기 반복 기능 |

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

정수 시작()

{

정적 날짜 시간 LastAlertTime = TimeCurrent();

int counted_bars=IndicatorCounted(),

한계;

if(counted_bars<0)

리턴(-1);

if(counted_bars>0)

counted_bars--;

limit=막대-counted_bars;

동안(제한)

{

더블 ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);

더블 ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);

더블 b4ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,1);

더블 b4ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1);

더블맘=iMomentum(NULL,0,14,PRICE_CLOSE,0);

더블 b4mom=iMomentum(NULL,0,14,PRICE_CLOSE,1);

//업 알람

if((LastAlertTime!=시간[0])&&(ema5>ema13)&&(ema5>b4ema5)&&(ema13>b4ema13)&&(엄마>b4엄마)&&(엄마>98.6591))

ExtMapBuffer1[limit]=상한[limit]+5*포인트;

LastAlertTime = 시간[0];

Alert(Symbol()," ",Period(),"M 가격 인상");

//알림 판매

if((LastAlertTime!=시간[0])&&(ema5<ema13)&&(ema5<b4ema5)&&(ema13<b4ema13)&&(엄마<b4mom)&&(엄마<100.6872))

ExtMapBuffer2[limit]=낮음[limit]-5*포인트;

LastAlertTime = 시간[0];

Alert(Symbol()," ",Period(),"M 가격 하락");

}

반환(0);

}

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

마스터캐시

지금 사용해 보세요

파일:
_test_mc.mq4  3 kb
 
mladen:
악셀

그것은 할 수 있습니다.

미결 주문은 원하는 유형에 대해 스캔해야 하며 미결제 가격은 원하는 새로운 시가와 비교하거나 개설된 바를 오픈 기준이 되는 바와 비교할 수 있습니다.

편집: 기능을 추가하는 것을 잊은 것 같습니다.

다른 "i= OrdersTotal ()-1"에 대해 아래와 같은 함수를 20번 정도 작성한 다음 모든 함수를 호출하고 새 시가와 비교하는 것이 작동합니까?

더블 OpenOrderPrice()

{

이중 TempOrderPrice = 0;

for(int i=OrdersTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)

{

TempOrderPrice = OrderOpenPrice();

}

}

반환(TempOrderPrice);

}

 
BlackCoq:
편집: 기능을 추가하는 것을 잊은 것 같습니다.

다른 "i=OrdersTotal()-1"에 대해 아래와 같은 함수를 20번 정도 작성한 다음 모든 함수를 호출하고 새 시가와 비교하는 것이 작동합니까?

더블 OpenOrderPrice()

{

이중 TempOrderPrice = 0;

for(int i=OrdersTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)

{

TempOrderPrice = OrderOpenPrice();

}

}

반환(TempOrderPrice);

}

다음과 같이 시도하십시오.

double OpenOrderPrice(double priceToCompareTo, double priceDeviation)

{

double TempOrderPrice = -1;

for(int i=OrdersTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)

{

if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)

TempOrderPrice = OrderOpenPrice();

break;

}

}

return(TempOrderPrice);

}

블랙콕

개봉해야 하는 가격과 가격의 최대 편차( 절대값 : 예를 들어 5포인트의 경우 5가 아니라 5*_Point)를 전달해야 하며, 차이가 해당 가격 편차보다 작거나 같은 경우 대략적인 가격으로 개설된 주문 가격을 반환합니다. 그렇지 않으면 결과적으로 -1을 반환합니다(이 경우 비슷한 가격의 주문이 없음을 의미).

 
mladen:
다음과 같이 시도하십시오.
double OpenOrderPrice(double priceToCompareTo, double priceDeviation)

{

double TempOrderPrice = -1;

for(int i=OrdersTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)

{

if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)

TempOrderPrice = OrderOpenPrice();

break;

}

}

return(TempOrderPrice);

}

블랙콕

개봉해야 하는 가격과 가격의 최대 편차(절대값: 예를 들어 5포인트의 경우 5가 아니라 5*_Point)를 전달해야 하며, 차이가 해당 가격 편차보다 작거나 같은 경우 대략적인 가격으로 개설된 주문 가격을 반환합니다. 그렇지 않으면 결과적으로 -1을 반환합니다(이 경우 비슷한 가격의 주문이 없음을 의미).

따라서 내가 구매하려는 가격에서 2핍을 벗어난 미결 주문이 있는지 확인하려면 이 함수를 호출합니다.

double BuyOpenOrderPrice(두 배 priceToCompareTo, 두 배 priceDeviation)

{

이중 TempOrderPrice = -1;

for(int i=OrdersTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)

{

if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)

TempOrderPrice = OrderOpenPrice();

가격편차 = 2*포인트;

priceToCompareTo = 묻다;

부서지다;

}

}

반환(TempOrderPrice);

}

그리고 반바지용으로 하나 더 만드시겠습니까?

 
BlackCoq:
따라서 내가 구매하려는 가격에서 2핍을 벗어난 미결 주문이 있는지 확인하려면 이 함수를 호출합니다.

double BuyOpenOrderPrice(두 배 priceToCompareTo, 두 배 priceDeviation)

{

이중 TempOrderPrice = -1;

for(int i=OrdersTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)

{

if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)

TempOrderPrice = OrderOpenPrice();

가격편차 = 2*포인트;

priceToCompareTo = 묻다;

부서지다;

}

}

반환(TempOrderPrice);

}

그리고 반바지용으로 하나 더 만드시겠습니까?

아니요

다음과 같이 함수 를 호출합니다.

if (OpenOrderPrice(OP_BUY,Ask ,2.0*_Point) == -1)은 long을 허용하고

if (OpenOrderPrice(OP_SELL,Ask,2.0*_Point) == -1) 반바지 허용

주문을 여는 논리가 있는 코드 부분에서 호출해야 합니다.

그러나 다음과 같이 기능이 달라야 합니다.

double OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

double TempOrderPrice = -1;

for(int i=OrdersTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))

if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)

{

if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)

TempOrderPrice = OrderOpenPrice();

break;

}

}

return(TempOrderPrice);

}

이 함수는 이제 두 가지 경우를 모두 다루므로 함수 내에서 코드를 변경하면 안 됩니다.

__________________

추신: _Point 변수는 metatrader 4의 이전 빌드에는 존재하지 않습니다. 위의 예는 새로운 metatrader4를 위해 작성되었습니다. 이전 빌드(509 이하)를 사용하는 경우 "_Point"는 "Point"여야 합니다.

 
mladen:
아니요

다음과 같이 함수를 호출합니다.

주문을 여는 논리가 있는 코드 부분에서 호출해야 합니다.

그러나 다음과 같이 기능이 달라야 합니다.

이 함수는 이제 두 가지 경우를 모두 다루므로 함수 내에서 코드를 변경하면 안 됩니다.

__________________

추신: _Point 변수는 metatrader 4의 이전 빌드에는 존재하지 않습니다. 위의 예는 새로운 metatrader4에 대해 작성되었습니다. 이전 빌드(509 이하)를 사용하는 경우 "_Point"는 "Point"여야 합니다.

고맙습니다. 함수를 EA에 복사해서 쓰신대로 호출했는데 어째서인지 새 가격의 편차 안에 다른곳이 있는데도 포지션을 열어줍니다. 그 기능은 모든 공개 가격 을 확인합니까, 아니면 최신 가격만 확인합니까?

아래의 EA를 포함합니다.

//+------------------------------------------------------------------+//| expert start function |

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

int start()

{

//----

bool result;

PipsUntilNextCandle--;

DisplayUserFeedback();

if (OldBars != Bars)

{

PipsUntilNextCandle = RenkoBoxSize;

OldBars = Bars;

DoesTradeExist();

double take;

double stop;

RefreshRates();

//Have the last candles risen , 1=last candle , 2 = last two candles

if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))

{

if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);

if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);

result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);

if (!result) OldBars = 0;

}

//if (Open[0] > Open[2])

//Have the last candles fallen , , 1=last candle , 2 = last two candles

if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))

{

if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);

if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);

result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);

if (!result) OldBars = 0;

}//if (Open[0] > Open[2])

}//if (OldBars != Bars)

//----
 
BlackCoq:
고맙습니다. 함수를 EA에 복사해서 쓰신대로 호출했는데 어째서인지 새 가격의 편차 안에 다른곳이 있는데도 포지션을 열어줍니다. 그 기능은 모든 공개 가격을 확인합니까, 아니면 최신 가격만 확인합니까?

아래의 EA를 포함합니다.

//+------------------------------------------------------------------+//| expert start function |

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

int start()

{

//----

bool result;

PipsUntilNextCandle--;

DisplayUserFeedback();

if (OldBars != Bars)

{

PipsUntilNextCandle = RenkoBoxSize;

OldBars = Bars;

DoesTradeExist();

double take;

double stop;

RefreshRates();

//Have the last candles risen , 1=last candle , 2 = last two candles

if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))

{

if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);

if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);

result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);

if (!result) OldBars = 0;

}

//if (Open[0] > Open[2])

//Have the last candles fallen , , 1=last candle , 2 = last two candles

if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))

{

if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);

if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);

result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);

if (!result) OldBars = 0;

}//if (Open[0] > Open[2])

}//if (OldBars != Bars)

//----

해당 기능 코드에 오류가 있습니다. OrderSelect()가 위치에서 작동한다고 가정하고 확인하지 않았습니다. 이것을 사용하십시오:

double OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

double TempOrderPrice = -1;

for(int i=OrdersTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)

{

if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)

TempOrderPrice = OrderOpenPrice();

break;

}

}

return(TempOrderPrice);

}

이제 제대로 작동해야 합니다.

 
mladen:
해당 기능 코드에 오류가 있습니다. OrderSelect()가 위치에서 작동한다고 가정하고 확인하지 않았습니다. 이것을 사용하십시오:
double OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

double TempOrderPrice = -1;

for(int i=OrdersTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)

{

if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)

TempOrderPrice = OrderOpenPrice();

break;

}

}

return(TempOrderPrice);

}

이제 제대로 작동해야 합니다.

그래서 그렇습니다. Mladen님, 수고해 주셔서 다시 한 번 감사드립니다.

 

안녕하세요 믈라덴입니다.

마지막 주문을 선택하고 마지막 오픈 가격 을 기반으로 추가 주문을 열려고 시도하는 이 코드를 살펴보십시오. 그거 빼곤 다 잘 되는거 같음

IfOrderDoesNotExist7(); IfOrderDoesNotExist5();

내가 두 가지 중 하나를 다음과 같이 설명하면 서로 간섭하는 것 같습니다. 순서가 잘 작동합니다.

// IfOrderDoesNotExist7();

IfOrderDoesNotExist5();

내가 뭘 잘못하고 있는지 말해 줄 수 있니?

파일:
564.mq4  10 kb
 
sulaimoney:
안녕하세요 믈라덴입니다.

마지막 주문을 선택하고 마지막 오픈 가격을 기반으로 추가 주문을 열려고 하는 동안 이 코드를 살펴보십시오. 그거 빼곤 다 잘 되는거 같음

IfOrderDoesNotExist7(); IfOrderDoesNotExist5();

내가 두 가지 중 하나를 다음과 같이 설명하면 서로 간섭하는 것 같습니다. 순서가 잘 작동합니다.

// IfOrderDoesNotExist7();

IfOrderDoesNotExist5();

내가 뭘 잘못하고 있는지 말해 줄 수 있니?

술라이 머니

문제는 이 두 기능 이 아니라 새로운 metatrader 4가 부울 조건을 확인하는 방식에 있다고 생각합니다(metatrader 4의 새로운 빌드 중 일부를 사용하는 경우). 코드를 약간 단순화하고 부울 조건을 엄격하게 정의해야 하는 한 곳을 해결했습니다. 사용해보기

파일:
564_1.mq4  10 kb