рд╣рдо рдЦрд░реЛрдВрдЪ рд╕реЗ рдореЗрдЯрд╛рд╕реНрдЯреЙрдХ рдХреЗ рд▓рд┐рдП рдбреАрдПрд▓рдПрд▓ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рднрд╛рдЧ рей

DLL  Metastock



рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рд╣рдорд╛рд░реЗ рд╕рдВрдХреЗрддрдХреЛрдВ (рднрд╛рдЧ 1, рднрд╛рдЧ 2) рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред MSXNthArg рдФрд░ MSXNthCustomString: MSX рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд╛рдпрдмреНрд░реЗрд░реА DLL рдХреЗ рддрд░реНрдХ рдореЗрдВ рджреЛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред



рдмрд╣рд╕



MSXNthArg рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕рдореЗрдВ рддрд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВред



BOOL __stdcall MSXNthArg (int a_iNthFunc, int a_iNthArg, MSXFuncArgDef *a_psFuncArgDef)
      
      





рдЬрд╣рд╛рдБ

тАв a_iNthFunc - рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХред

тАв a_iNthArg рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИред

тАв a_psFuncArgDef - MSXFuncArgDef рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ:

тАв MSX_SUCCESS рдЕрдЧрд░ рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реИ рдФрд░

тАв рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ MSX_ERRORред

рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЛ рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

тАв MSXDataArray - рдбреЗрдЯрд╛ рдРрд░реЗ

тАв MSXNumeric - рд╕рдВрдЦреНрдпрд╛,

тАв MSXString - рд╕реНрдЯреНрд░рд┐рдВрдЧ,

тАв MSXCustom - рдХрд╕реНрдЯрдоред

рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдкрдирд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред MSXCustom рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рддрд░реНрдХ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрдЯ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рджрд╕реНрдп рдореБрдЭреЗ рдХрд╕реНрдЯрдо рддрд░реНрдХ рдХрд╣реЗрдВрдЧреЗред рдпрджрд┐ рддрд░реНрдХ рдкреНрд░рдХрд╛рд░ MSXCustom рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХрд╕реНрдЯрдо рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреА рд╣реЛрдЧреАред рдпрд╣реА рд╣реИ, рдЬрдм рддрд░реНрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо MSXNthArg рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ

рдЧреИрд░- MSXCustom рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП:



 a_psFuncArgDef->iArgType = MSXDataArray; //  MSXNumeric  MSXString strcpy (a_psFuncArgDef->szArgName, " ");
      
      





MSXCustom рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП:



 a_psFuncArgDef->iArgType = MSXCustom; a_psFuncArgDef->iNCustomStrings = 8; //  custom- strcpy (a_psFuncArgDef->szArgName, " ");
      
      







MSXNthCustomString рдХрд╕реНрдЯрдо рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИред



 BOOL __stdcall MSXNthCustomString (int a_iNthFunc, int a_iNthArg, int a_iNthString, MSXFuncCustomString *a_psCustomString)
      
      





рдЬрд╣рд╛рдБ

тАв a_iNthFunc - рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХред

тАв a_iNthArg рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИред

тАв a_iNthString - рдХрд╕реНрдЯрдо рддрд░реНрдХ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХред

тАв a_psFuncArgDef - MSXFuncCustomString рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╕реНрдЯрдо рддрд░реНрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдкрд┐рдЫрд▓реЗ рдорд╛рдиреЛрдВ рдХреЗ рд╕рдорд╛рди рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдХрд╕реНрдЯрдо рддрд░реНрдХ рдПрдХ рдЬреЛрдбрд╝реА рд╣реИ: рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ред MSXNthCustomString рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдЖрдИрдбреА) рдХреЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдХрд╕реНрдЯрдо рддрд░реНрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд╕реНрдЯрдо рддрд░реНрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд╛рд░ рдореЗрдВ рдХреЗрд╡рд▓ рдЕрд▓реНрдлрд╝рд╛рдиреНрдпреВрдореЗрд░рд┐рдХ рд╡рд░реНрдг рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдФрд░ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдгреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рдХрд╕реНрдЯрдо рддрд░реНрдХ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рджрд╕ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреАред рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рддрд░реНрдХ 0 рд╕реЗ рдЧрд┐рдиреЗ рдЬрд╛рддреЗ рд╣реИрдВред



рдЕрдкрд╡рд╛рдж



рдореЗрдЯрд╛рд╕реНрдЯреЙрдХ рдХреНрд░реИрд╢ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдкрд╡рд╛рдж рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

тАв рдЕрдорд╛рдиреНрдп рддрд░реНрдХ,

тАв рдЖрдиреЗ рд╡рд╛рд▓реА (рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреБрдХреНрдд) рд╕рд░рдгреА рдореЗрдЯрд╛рд╕реНрдЯреЙрдХ рдорд╛рдирдХреЛрдВ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддреА рд╣реИ (рднрд╛рдЧ 2 рджреЗрдЦреЗрдВ),

тАв рддрд░реНрдХ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ,

тАв рддрд░реНрдХ рд╕рддреНрдп рдирд╣реАрдВ рд╣реИ,

тАв рдЖрдЙрдЯрдкреБрдЯ (рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдо) рд╕рд░рдгреА рдореЗрдЯрд╛рд╕реНрдЯреЙрдХ рдорд╛рдирдХреЛрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВрдЧреЗ:



 if (  ,  , ) { strncpy (a_psResult->szExtendedError, "Error:  ", sizeof(a_psResult->szExtendedError)-1); //    a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; }
      
      





рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬреЛрдбрд╝реАрдВред



рдЙрджрд╛рд╣рд░рдг



рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдЪрд╛рд░ рд╕рдВрдХреЗрддрдХ рдмрдирд╛рдП рдЬреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдХреЗрддрдХ рдХреЗ рджреЛ рддрд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВ - рдПрдХ рд╕рд░рдгреА, рдФрд░ рджреВрд╕рд░рд╛ рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореИрдВрдиреЗ рдЪрд░рдгреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ред

рд╣рдо рддреАрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ: MSXStruc.h, Add.cpp, Add.defред рд╣рдорд╛рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдирд╛рдо Add.dll рд╣реЛрдЧрд╛ред



рдЪрд░рдг 1 - рд╣реЗрдбрд░ рдФрд░ рдирд┐рд░реНрдпрд╛рдд

рдХреЛрдб


 #include <string.h> #include <stdlib.h> #include <math.h> #include <float.h> #include <tchar.h> #include "MSXStruc.h" #define DLL_EXPORT extern "C" __declspec(dllexport)
      
      







рдЪрд░рдг 2 - рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреИрд░рд╛рдореАрдЯрд░



рдпрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреИрд░рд╛рдореАрдЯрд░ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВред

рдХреЛрдб


 //    const char *szMayCopyright ="VS 2010 C++ MSX DLL, Copyright (c) andrzwet, 2014"; const int MyFuncs = 4; //    (fan1,fan2,fan3,fan4) //   const char *szNfan1 = "fan1"; const char *szNfan2 = "fan2"; const char *szNfan3 = "fan3"; const char *szNfan4 = "fan4"; //   const char *szDfan1 = "Add- (DA1 + DA2)"; const char *szDfan2 = "Add- (DA1 + Number)"; const char *szDfan3 = "Add- (DA1 + DAStr)"; const char *szDfan4 = "Add- (DA1 + DACust)"; const int fan1Args = 2; // 2    fan1 - 2  //    fan1 const char *szNAfan1Arg1 = "DA1"; const char *szNAfan1Arg2 = "DA2"; const int fan2Args = 2; // 2    fan2 - 1  ,1  //    fan2 const char *szNAfan2Arg1 = "DA1"; const char *szNNfan2Arg2 = "Numeric"; const int fan3Args = 2; // 2    fan3 - 1  ,1  //    fan3 const char *szNAfan3Arg1 = "DA1"; const char *szNSfan3Arg2 = "DAStr"; const int fan4Args = 2; // 2    fan4 - 1  ,1 CustomType //    fan4 const char *szNAfan4Arg1 = "DA1"; const char *szNCfan4Arg2 = "DACust"; const int fan4ArgsCust = 8; //      fan4  Custom, //       8  () //  custom-   char *szCust1 = "Open"; char *szCust5 = "O"; int id1 = 0; char *szCust2 = "High"; char *szCust6 = "H"; int id2 = 1; char *szCust3 = "Low"; char *szCust7 = "L"; int id3 = 2; char *szCust4 = "Close"; char *szCust8 = "C"; int id4 = 3;
      
      







рдЪрд░рдг 3 - рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдп



рдЪрд╛рд░ рдХрд╛рд░реНрдп рдпрд╣рд╛рдБ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ: MSXInfo, MSXNthFunction, MSXNthArg, MSXNthCustomStringред

рдХреЛрдб


 // ---------------------------------------------------- DLL_EXPORT BOOL __stdcall MSXInfo (MSXDLLDef *a_psDLLDef) { strncpy (a_psDLLDef->szCopyright, szMayCopyright, sizeof(a_psDLLDef->szCopyright)-1); a_psDLLDef->iNFuncs = MyFuncs; //  . a_psDLLDef->iVersion = MSX_VERSION; return MSX_SUCCESS; } // ---------------------------------------------------- DLL_EXPORT BOOL __stdcall MSXNthFunction (int a_iNthFunc, MSXFuncDef *a_psFuncDef) { BOOL l_bRtrn = MSX_SUCCESS; switch (a_iNthFunc) { case 0: // --- fan1 --- strcpy (a_psFuncDef->szFunctionName, szNfan1); //  strcpy (a_psFuncDef->szFunctionDescription, szDfan1); //  a_psFuncDef->iNArguments = fan1Args; //   break; case 1: // --- fan2 --- strcpy (a_psFuncDef->szFunctionName, szNfan2); //  strcpy (a_psFuncDef->szFunctionDescription, szDfan2); //  a_psFuncDef->iNArguments = fan2Args; //   break; case 2: // --- fan3 --- strcpy (a_psFuncDef->szFunctionName, szNfan3); //  strcpy (a_psFuncDef->szFunctionDescription, szDfan3); //  a_psFuncDef->iNArguments = fan3Args; //   break; case 3: // --- fan4 --- strcpy (a_psFuncDef->szFunctionName, szNfan4); //  strcpy (a_psFuncDef->szFunctionDescription, szDfan4); //  a_psFuncDef->iNArguments = fan4Args; //  . break; default: l_bRtrn = MSX_ERROR; break; } return l_bRtrn; } // ---------------------------------------------------- DLL_EXPORT BOOL __stdcall MSXNthArg (int a_iNthFunc, int a_iNthArg, MSXFuncArgDef *a_psFuncArgDef) { BOOL l_bRtrn = MSX_SUCCESS; //   custom- = 0 () a_psFuncArgDef->iNCustomStrings = 0; switch (a_iNthFunc) { case 0: // ---  fan1 --- switch (a_iNthArg) { case 0: a_psFuncArgDef->iArgType = MSXDataArray; //  strcpy (a_psFuncArgDef->szArgName, szNAfan1Arg1); //  break; case 1: a_psFuncArgDef->iArgType = MSXDataArray; //  strcpy (a_psFuncArgDef->szArgName, szNAfan1Arg2); //  break; default: l_bRtrn = MSX_ERROR; break; } break; case 1: // ---  fan2 --- switch (a_iNthArg) { case 0: a_psFuncArgDef->iArgType = MSXDataArray; //  strcpy (a_psFuncArgDef->szArgName, szNAfan2Arg1); //  break; case 1: a_psFuncArgDef->iArgType = MSXNumeric; //  strcpy (a_psFuncArgDef->szArgName, szNNfan2Arg2); //  break; default: l_bRtrn = MSX_ERROR; break; } break; case 2: // ---  fan3 --- switch (a_iNthArg) { case 0: a_psFuncArgDef->iArgType = MSXDataArray; //  strcpy (a_psFuncArgDef->szArgName, szNAfan3Arg1); //  break; case 1: a_psFuncArgDef->iArgType = MSXString; //  strcpy (a_psFuncArgDef->szArgName, szNSfan3Arg2); //  break; default: l_bRtrn = MSX_ERROR; break; } break; case 3: // ---  fan4 --- switch (a_iNthArg) { case 0: a_psFuncArgDef->iArgType = MSXDataArray; //  strcpy (a_psFuncArgDef->szArgName, szNAfan4Arg1); //  break; case 1: a_psFuncArgDef->iArgType = MSXCustom; //  a_psFuncArgDef->iNCustomStrings = fan4ArgsCust; // - custom- strcpy (a_psFuncArgDef->szArgName, szNCfan4Arg2); //  break; default: l_bRtrn = MSX_ERROR; break; } break; default: l_bRtrn = MSX_ERROR; break; } return l_bRtrn; } // ---------------------------------------------------- DLL_EXPORT BOOL __stdcall MSXNthCustomString (int a_iNthFunc, int a_iNthArg, int a_iNthString, MSXFuncCustomString *a_psCustomString) { BOOL l_bRtrn = MSX_SUCCESS; //  a_psCustomString->szString[0] = '\0'; a_psCustomString->iID = -1; //   typedef struct { char *szString; int iID; } LocalStringElement; //        LocalStringElement l_sTheStrings[] = { {szCust1, id1}, {szCust5, id1}, {szCust2, id2}, {szCust6, id2}, {szCust3, id3}, {szCust7, id3}, {szCust4, id4}, {szCust8, id4} }; switch (a_iNthFunc) { case 3: // Custom-       (fan4) switch (a_iNthArg) { case 1: // Custom-      fan4 //   Custom-. if(a_iNthString >= 0 && a_iNthString < fan4ArgsCust) { //     ID strncpy (a_psCustomString->szString, l_sTheStrings[a_iNthString].szString, sizeof(a_psCustomString->szString)-1); a_psCustomString->iID = l_sTheStrings[a_iNthString].iID; } break; default: l_bRtrn = MSX_ERROR; break; } break; default: l_bRtrn = MSX_ERROR; break; } return l_bRtrn; }
      
      







рдЪрд░рдг 4 - рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп



рдпрд╣рд╛рдВ рд╣рдо рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред

рдХреЛрдб


 /* ForceFloatRange -              float . тАв FLT_MAX тАФ   ,      float (3.402823466e+38F), тАв FLT_MIN тАФ   ,      float (1.175494351e-38F). */ #define MSXMax(a,b) (((a) > (b)) ? (a) : (b)) #define MSXMin(a,b) (((a) < (b)) ? (a) : (b)) double ForceFloatRange (double a_lfDbl) { if (a_lfDbl > 0.0) { a_lfDbl = MSXMin (a_lfDbl, double(FLT_MAX)); a_lfDbl = MSXMax (a_lfDbl, double(FLT_MIN)); } else { if (a_lfDbl < 0.0) { a_lfDbl = MSXMax (a_lfDbl, double(-FLT_MAX)); a_lfDbl = MSXMin (a_lfDbl, double(-FLT_MIN)); } } return a_lfDbl; } /* MSXArray -               MetaStock.       MSXDataRec    .      ,          MSXDataRec.   ,  ,              Metastock BasicData,     . ,         ,    MetaStock'. */ BOOL MSXArray(const MSXDataRec *BasicData, const MSXDataInfoRec *ArgData) { if (ArgData->iFirstValid < 0) return FALSE; if (ArgData->iLastValid < 0) return FALSE; if (ArgData->iLastValid < ArgData->iFirstValid) return FALSE; if (ArgData->iFirstValid < BasicData->sClose.iFirstValid) return FALSE; if (ArgData->iLastValid > BasicData->sClose.iLastValid) return FALSE; return TRUE; }
      
      







рдЪрд░рдг 5 - рдмрд╛рд╣рд░реА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ



fan1 рджреЛ рдбреЗрдЯрд╛ рд╕рд░рдгрд┐рдпреЛрдВ ( ExtFml ("Add.fan1", DA1, DA2) рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреЛ рддрд░реНрдХ рд╣реИрдВ, рджреЛрдиреЛрдВ рдбреЗрдЯрд╛ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред

fan1
 DLL_EXPORT BOOL __stdcall fan1 (const MSXDataRec *a_psBasic, const MSXDataInfoRecArgsArray *a_psArrayArgs, const MSXNumericArgsArray *a_psNumericArgs, const MSXStringArgsArray *a_psStringArgs, const MSXCustomArgsArray *a_psCustomArgs, MSXResultRec *a_psResult) { int i = 0; //     (  ) int iMinRecords = a_psBasic->sClose.iFirstValid; int iMaxRecords = a_psBasic->sClose.iLastValid; //   const MSXDataInfoRec *l_psInput1 = a_psArrayArgs->psDataInfoRecs[0]; const MSXDataInfoRec *l_psInput2 = a_psArrayArgs->psDataInfoRecs[1]; int iLvi; int iFvi; // ,     if ( a_psArrayArgs->iNRecs == 2 && a_psNumericArgs->iNRecs == 0 && a_psStringArgs->iNRecs == 0 && a_psCustomArgs->iNRecs == 0) { if (!(MSXArray(a_psBasic, l_psInput1) && MSXArray(a_psBasic, l_psInput2) )) { //    ,    strncpy (a_psResult->szExtendedError, "Error: Corrupted Input Array", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } //      if (l_psInput1 && l_psInput2) { //    fan1 for (i=iMinRecords; i<=iMaxRecords; i++) a_psResult->psResultArray->pfValue[i] = float (ForceFloatRange(l_psInput1->pfValue[i] + l_psInput2->pfValue[i])); //        iFvi = MSXMax(l_psInput1->iFirstValid,l_psInput2->iFirstValid); iLvi = MSXMin(l_psInput1->iLastValid,l_psInput2->iLastValid); a_psResult->psResultArray->iFirstValid = iFvi; a_psResult->psResultArray->iLastValid = iLvi; } else { //  ! strncpy (a_psResult->szExtendedError, "Error: Data array argument missing", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } } else { //   ! strncpy (a_psResult->szExtendedError, "Error: Wrong number of arguments", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } if (!MSXArray(a_psBasic, a_psResult->psResultArray)) { //    ,    strncpy (a_psResult->szExtendedError, "Error: Corrupted Result Array.", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } return MSX_SUCCESS; }
      
      







fan2 рдбреЗрдЯрд╛ рд╕рд░рдгреА рдФрд░ рд╕рдВрдЦреНрдпрд╛ ( ExtFml ("Add.fan2", DA1, Numeric) рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рджреЛ рддрд░реНрдХ рд╣реИрдВ, рдПрдХ рдбреЗрдЯрд╛ рд╕рд░рдгреА рд╣реИ, рджреВрд╕рд░рд╛ рдПрдХ рдирдВрдмрд░ рд╣реИред

fan2


 DLL_EXPORT BOOL __stdcall fan2 (const MSXDataRec *a_psBasic, const MSXDataInfoRecArgsArray *a_psArrayArgs, const MSXNumericArgsArray *a_psNumericArgs, const MSXStringArgsArray *a_psStringArgs, const MSXCustomArgsArray *a_psCustomArgs, MSXResultRec *a_psResult) { int i = 0; //   const MSXDataInfoRec *l_psInput = a_psArrayArgs->psDataInfoRecs[0]; // float l_fNumber = a_psNumericArgs->fNumerics[0]; // // ,     if ( a_psArrayArgs->iNRecs == 1 && a_psNumericArgs->iNRecs == 1 && a_psStringArgs->iNRecs == 0 && a_psCustomArgs->iNRecs == 0) { if (!MSXArray(a_psBasic, l_psInput)) { //     strncpy (a_psResult->szExtendedError, "Error: Corrupted Input Array", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } //     if (l_psInput) { //    fan2 for (i=l_psInput->iFirstValid; i<=l_psInput->iLastValid; i++) a_psResult->psResultArray->pfValue[i] = float (ForceFloatRange(l_psInput->pfValue[i] + l_fNumber)); //        a_psResult->psResultArray->iFirstValid = l_psInput->iFirstValid; a_psResult->psResultArray->iLastValid = l_psInput->iLastValid; } else { //   ! strncpy (a_psResult->szExtendedError, "Error: Array argument missing", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } } else { //   ! strncpy (a_psResult->szExtendedError, "Error: Wrong number of arguments", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } if (!MSXArray(a_psBasic, a_psResult->psResultArray)) { //    ,    strncpy (a_psResult->szExtendedError, "Error: Corrupted Result Array", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } return MSX_SUCCESS; }
      
      







fan3 рдбреЗрдЯрд╛ рд╕рд░рдгреА рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рд╕рд░рдгреА рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ

( ExtFml ("Add.fan3", DA1, DAStr) )ред

рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рджреЛ рддрд░реНрдХ рд╣реИрдВ, рдПрдХ рдбреЗрдЯрд╛ рд╕рд░рдгреА рд╣реИ, рджреВрд╕рд░рд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИред

fan3


 DLL_EXPORT BOOL __stdcall fan3 (const MSXDataRec *a_psBasic, const MSXDataInfoRecArgsArray *a_psArrayArgs, const MSXNumericArgsArray *a_psNumericArgs, const MSXStringArgsArray *a_psStringArgs, const MSXCustomArgsArray *a_psCustomArgs, MSXResultRec *a_psResult) { int i = 0; int iMinRecords = a_psBasic->sClose.iFirstValid; int iMaxRecords = a_psBasic->sClose.iLastValid; const MSXDataInfoRec *l_psInput1; l_psInput1 = a_psArrayArgs->psDataInfoRecs[0]; //  const char *l_pszInput2 =a_psStringArgs->pszStrings[0]; //  const MSXDataInfoRec *l_psData; int iLvi; int iFvi; //  ,    if ( a_psArrayArgs->iNRecs == 1 && a_psNumericArgs->iNRecs == 0 && a_psStringArgs->iNRecs == 1 && a_psCustomArgs->iNRecs == 0) { if (!MSXArray(a_psBasic, l_psInput1)) { //     strncpy (a_psResult->szExtendedError, "Error: Corrupted Input Array", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } //      if (l_psInput1) { //      if (l_pszInput2) { while (*l_pszInput2) { //    switch (*l_pszInput2++) { case 'O': case 'o': l_psData = &a_psBasic->sOpen; break; case 'H': case 'h': l_psData = &a_psBasic->sHigh; break; case 'L': case 'l': l_psData = &a_psBasic->sLow; break; case 'C': case 'c': l_psData = &a_psBasic->sClose; break; default: //    ! strncpy (a_psResult->szExtendedError, "Error: Wrong String argument", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; break; } //    fan3 for (i=iMinRecords; i<=iMaxRecords; i++) a_psResult->psResultArray->pfValue[i] = float(ForceFloatRange( l_psData->pfValue[i] + l_psInput1->pfValue[i])); iFvi = MSXMax(l_psInput1->iFirstValid, l_psData->iFirstValid); iLvi = MSXMin(l_psInput1->iLastValid, l_psData->iLastValid); a_psResult->psResultArray->iFirstValid = iFvi; a_psResult->psResultArray->iLastValid = iLvi; } } else { //   ! strncpy (a_psResult->szExtendedError, "Error: String argument missing", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } } else { //   ! strncpy (a_psResult->szExtendedError, "Error: Array argument missing", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } } else { //   ! strncpy (a_psResult->szExtendedError, "Error: Wrong number of arguments", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } if (!MSXArray(a_psBasic, a_psResult->psResultArray)) { strncpy (a_psResult->szExtendedError, "Error: Corrupted Result Array", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } return MSX_SUCCESS; }
      
      







fan4 рдбреЗрдЯрд╛ рд╕рд░рдгреА рдФрд░ рдХрд╕реНрдЯрдо рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдбреЗрдЯрд╛ рд╕рд░рдгреА рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ

( ExtFml ("Add.fan4", DA1, DACust) )ред

рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рджреЛ рддрд░реНрдХ рд╣реИрдВ, рдПрдХ рдбреЗрдЯрд╛ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ, рджреВрд╕рд░рд╛ MSXCustom рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рддрд░реНрдХ рд╣реИред

fan4


 DLL_EXPORT BOOL __stdcall fan4 (const MSXDataRec *a_psBasic, const MSXDataInfoRecArgsArray *a_psArrayArgs, const MSXNumericArgsArray *a_psNumericArgs, const MSXStringArgsArray *a_psStringArgs, const MSXCustomArgsArray *a_psCustomArgs, MSXResultRec *a_psResult) { int i = 0; int iMinRecords = a_psBasic->sClose.iFirstValid; int iMaxRecords = a_psBasic->sClose.iLastValid; const MSXDataInfoRec *l_psInput1; l_psInput1 = a_psArrayArgs->psDataInfoRecs[0]; //  int l_psInput2 = a_psCustomArgs->iCustomIDs[0]; // custom int iLvi; int iFvi; // ,     if ( a_psArrayArgs->iNRecs == 1 && a_psNumericArgs->iNRecs == 0 && a_psStringArgs->iNRecs == 0 && a_psCustomArgs->iNRecs == 1) { if (!(MSXArray(a_psBasic, l_psInput1) ) ) { strncpy (a_psResult->szExtendedError, "Error: Corrupted Input Array", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } //   if (l_psInput1) { switch (l_psInput2) { case 0: // Open { for (i=iMinRecords; i<=iMaxRecords; i++) a_psResult->psResultArray->pfValue[i] = float(ForceFloatRange(a_psBasic->sOpen.pfValue[ i ] + l_psInput1->pfValue[i])); iLvi = MSXMin(l_psInput1->iLastValid,iMaxRecords); iFvi = MSXMax(l_psInput1->iFirstValid,iMinRecords); a_psResult->psResultArray->iFirstValid = iFvi; a_psResult->psResultArray->iLastValid = iLvi; } break; case 1: // High { for (i=iMinRecords; i<=iMaxRecords; i++) a_psResult->psResultArray->pfValue[i] = float(ForceFloatRange(a_psBasic->sHigh.pfValue[ i ] + l_psInput1->pfValue[i])); iLvi = MSXMin(l_psInput1->iLastValid,iMaxRecords); iFvi = MSXMax(l_psInput1->iFirstValid,iMinRecords); a_psResult->psResultArray->iFirstValid = iFvi; a_psResult->psResultArray->iLastValid = iLvi; } break; case 2: // Low { for (i=iMinRecords; i<=iMaxRecords; i++) a_psResult->psResultArray->pfValue[i] = float(ForceFloatRange(a_psBasic->sLow.pfValue[ i ] + l_psInput1->pfValue[i])); iLvi = MSXMin(l_psInput1->iLastValid,iMaxRecords); iFvi = MSXMax(l_psInput1->iFirstValid,iMinRecords); a_psResult->psResultArray->iFirstValid = iFvi; a_psResult->psResultArray->iLastValid = iLvi; } break; case 3: // Close { for (i=iMinRecords; i<=iMaxRecords; i++) a_psResult->psResultArray->pfValue[i] = float(ForceFloatRange(a_psBasic->sClose.pfValue[ i ] + l_psInput1->pfValue[i])); iLvi = MSXMin(l_psInput1->iLastValid,iMaxRecords); iFvi = MSXMax(l_psInput1->iFirstValid,iMinRecords); a_psResult->psResultArray->iFirstValid = iFvi; a_psResult->psResultArray->iLastValid = iLvi; } break; default: { //   custom-! strncpy (a_psResult->szExtendedError, "Error: Invalid Custom argument", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } break; } } else { //   ! strncpy (a_psResult->szExtendedError, "Error: Array argument missing", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } } else { //   ! strncpy (a_psResult->szExtendedError, "Error: Wrong number of arguments", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } if (!MSXArray(a_psBasic, a_psResult->psResultArray)) { strncpy (a_psResult->szExtendedError, "Error: Corrupted Result Array", sizeof(a_psResult->szExtendedError)-1); a_psResult->psResultArray->iFirstValid = 0; a_psResult->psResultArray->iLastValid = -1; return MSX_ERROR; } return MSX_SUCCESS; }
      
      







рдЪрд░рдг 6 - DEF рдлрд╝рд╛рдЗрд▓



рдиреАрдЪреЗ рдореЗрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг DEF рдлрд╝рд╛рдЗрд▓ рд╣реИред

DEF рдлрд╝рд╛рдЗрд▓ рдПрдХ рдЕрд▓рдЧ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рдорд╛рди рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

Add.def


 LIBRARY Add EXPORTS MSXInfo MSXNthFunction MSXNthArg MSXNthCustomString fan1 fan2 fan3 fan4
      
      







рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдореИрдВ рдореЗрдЯрд╛рд╕реНрдЯреЙрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдПрдордПрд╕рдПрдХреНрд╕ рдбреАрдПрд▓рдПрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕реБрд▓рдн рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред



All Articles