Nochmals zur MT4GUI. Ich habe die DLL nicht benutzen können oder wollen, und zwar nicht nur weil sie nicht Thread Safe ist, sondern weil der Code nicht einsehbar ist.
Um jedoch MT4 zu einem Button zu verhelfen der den Klick sofort durchreicht, ohne das es erst einen Tick vom MT4 bedarf, ist eine DLL nötig die zwischen dem Programm schaltet. Diese habe ich dann doch noch im Netz finden können:
forexfactory.com/showthread.php?t=361861
Die DLL ist einsehbar und man kann, sofern man Lust hat, sie neukompilieren.
Ich selbst habe den Indikatorcode einfach nach meinen Wünschen abgeändert, wichtig war halt die lbuttondown() Funktion um den Klick im Chart platzieren zu können. Dann sollte bei den Funktionen makeControls() und updateControls() die entsprechenden Labels und Buttons kreiert werden.
Um die Buttons auf den Chart zu bringen habe ich eine Funktion benutzt die Wingdings verwendet:
Falls jemand fragen zur Herangehensweise hat, einfach hier im Forum melden. Ich werde dann soweit mir möglich Hilfestellung leisten.
Um jedoch MT4 zu einem Button zu verhelfen der den Klick sofort durchreicht, ohne das es erst einen Tick vom MT4 bedarf, ist eine DLL nötig die zwischen dem Programm schaltet. Diese habe ich dann doch noch im Netz finden können:
forexfactory.com/showthread.php?t=361861
Die DLL ist einsehbar und man kann, sofern man Lust hat, sie neukompilieren.
Ich selbst habe den Indikatorcode einfach nach meinen Wünschen abgeändert, wichtig war halt die lbuttondown() Funktion um den Klick im Chart platzieren zu können. Dann sollte bei den Funktionen makeControls() und updateControls() die entsprechenden Labels und Buttons kreiert werden.
Um die Buttons auf den Chart zu bringen habe ich eine Funktion benutzt die Wingdings verwendet:
Quellcode
- void DrawCell(int nWindow, string nCellName, double nX, double nY, double nWidth, double nHeight, color nColor)
- {
- double iHeight, iWidth, iXSpace;
- int iSquares, i;
- if(nWidth > nHeight)
- {
- iSquares = MathCeil(nWidth/nHeight); // Number of squares used.
- iHeight = MathRound((nHeight*100)/77); // Real height size.
- iWidth = MathRound((nWidth*100)/77); // Real width size.
- iXSpace = iWidth/iSquares - ((iHeight/(9-(nHeight/100)))*2);
- for(i=0;i<iSquares;i++)
- {
- ObjectDelete(nCellName+i);
- ObjectCreate (nCellName+i, OBJ_LABEL,nWindow,0,0);
- ObjectSetText (nCellName+i, CharToStr(110),iHeight, "Wingdings", nColor);
- ObjectSet (nCellName+i, OBJPROP_CORNER, 1);
- ObjectSet (nCellName+i, OBJPROP_XDISTANCE,nX + iXSpace*i);
- ObjectSet (nCellName+i, OBJPROP_YDISTANCE,nY);
- ObjectSet (nCellName+i, OBJPROP_BACK, true);
- }
- }else{
- iSquares = MathCeil(nHeight/nWidth); // Number of squares used.
- iHeight = MathRound((nHeight*100)/77); // Real height size.
- iWidth = MathRound((nWidth*100)/77); // Real width size.
- iXSpace = iHeight/iSquares - ((iWidth/(9-(nWidth/100)))*2);
- for(i=0;i<iSquares;i++)
- {
- ObjectDelete(nCellName+i);
- ObjectCreate (nCellName+i, OBJ_LABEL,nWindow,0,0);
- ObjectSetText (nCellName+i, CharToStr(110),iWidth, "Wingdings", nColor);
- ObjectSet (nCellName+i, OBJPROP_CORNER, 1);
- ObjectSet (nCellName+i, OBJPROP_XDISTANCE,nX);
- ObjectSet (nCellName+i, OBJPROP_YDISTANCE,nY + iXSpace*i);
- ObjectSet (nCellName+i, OBJPROP_BACK, true);
- }
- }
- }
Falls jemand fragen zur Herangehensweise hat, einfach hier im Forum melden. Ich werde dann soweit mir möglich Hilfestellung leisten.