1100110001011100000001011100111010110111001100011101101101001111010010110011101111100000110000101101111111111100001101101101110011110101110101011101100111001000010010101101110001010110001000001111111001101101110010010100100111100101001100001101101011001110110001101000000100001100111010010000011001010111110001001110100111111110101011011100010100110101110101001101101111110000111111110110101001100010 0000010001110000011110100001100000000010011001001011101111011011101000001000000100101100000100010101100011000100111111000101111110100000100100101010111011001000111110100011101101111010111011011000101000010101011100001001010111011000100111000000110101000101011101001001000000101101001000110100100011011111111110111001111111111000110101111011111110001000100100100001100110111110100110100000011100110010 0001111101100001101110101100000111101110001011101001100110101010101001111111101111001000011101011011101110001011110110000011101101110000110110011100010001000111111100101000001011000101001011101011111110010000011010001001011100001001110000111011101010011000011010011110010111000111011111100110100101010111011111110110011010010001001100010001011001001110011111011111000100110001000101110110000010011010 1101010100110011001111100000101000110100111110011101111100001011111111111000000010011100001010111011000010111111000101101101000001000100101010010011110011100110101011011001101100111001100110111110000000111000111110000100000000100000000100000110001011110000100010011111000010100100101000101100001000100110101101011111010010100111010101110000111010010010011000010000111101100011001001110011101110010100 0001111010011101111001000111011011110111001111111011100111100111010111100111110010001001001110111101000010011111100110111000011111000101110000000000011010110101110011101101101000010111001111111001010100011110101010100101000000100111110011110110101011100010110111000110110110111001000110011011111001110110110011111100010011110010100010001110001011001010111110000010100011111001000011010111010011110000 1001000011101111010000001110001011010010011100111111000010111110111010111000101010110001101001100010111010010000100101100101001100010110010001001000110011001101010010001110111111100011110011001110010110111100000001011010011110001110100101101011000111000001101111110010110010001010001001101000111111010010110011110000110101010000100101111100011011100100000000100010100010010000100011011110011100011111 0110011001011010000110111010100110000110110111000011001101010011111100100101010101101011101011110110100000100011011110000110101001011100111100110011110110111010000110001011110101100111010100100011110010101011100110000000100000101000111101110111110110000010110111000101011000011000000001110111011000001100010000000100011010110011100011100010010110110011100010100011111010011101001000110111000101101001 0111100101000001111010001101010111011010110010011000110101111011001100100001011011100111100000000011101000001001010101100011001111111001000000011110101100101000110111100100110011100000110010100111010111011001101000101011101000111010011011100101001111110000001010100111100101110110100001101111110000011010100000001010110000111110011001111000010100101111011001000000111100100001011111101001111001001111 1001111010110111101110001000111100100111010111000101110001000010111011010101010100001110011011111000111001001101100111101001101111111010110101110110000101101010101100010100001101111011111100100010000110011101010010001110111011001011001110000011101100101110011101111000011010101001110011100011110101000011111111010000100000010011100110000101001010101100000011011110000110001010110101010001101110010001 0110011011110001100101001110011000011011000011111110011000111010101010010101101011001111001011001101010101100101010100110001010100111001101000011011101111100001101010110101101111111001110101010101011111101111011010011101000011100110100001110010101011101100101100000110100011011110001110000111110101100000110101110100001011010010001100100000100110001010011111101011000111000011110001110000001110010001 1110011111010100000011010111010000110001111001101001101111010111000011000100001011110001011101100110011011100111100001001010011010100111001010110010000100010111110101100011100110100111110111010101101000010001011001111110011010011010011011010000001111100101110001100001000000001111000000100100000000000110101000011010000001101011101000101111111111100010111010111010010011001001110100001100000100001010 1111011110011010101101010001001101111001110110111001011001001101100100011101100001111101000010111100101011111000000101011011011011011011011001000010110000100000101110000111000111001011111001001011110001000010011010101001001001100000101001001001000001010000010001001010011101000000010000110011000110100110100111001000001000001100101110110101101111111100011111100001100011110010100011100011011100110000 0000010110001001110101101100001110000010001101101001110011001110101100010000111001010101000011111101110001110110101100011011101111000010101101001001100001100001101111100011001001100100101111010101011101110011011000011010010001101000100111111100000011111010111010000001011100111111011001001101010110000010110110101100001010011010001100011011111100000001111111010101101110110010000111010111000011001010 0010110010010111001110011001011100010010111000001110100100111010000011100001110010101100000010010010100011110100100011100010100101111011011101010111010111011110000101100011100101101001110100111110111110100000010011001000101011110010100010101010101100100011011011110001110111001100111110010010011001110011001001000101011001100001100100110111000000101100010110001100111110001000100011010101101101000101 0000111101101101100101101101010111001110011011100000000001111011110111110010001110011001010110010000101100110110110001100001101110011000111111110110010011001110111001011011100101110110100101111111101100000111010010110010001100010101001100111011010100101000111100011101011100000000001000001011101111110111011111011111100101010110101011111001101110000100000010101010001100101100110101110010011101000010 1110000001100001101101101001110000110011101011100110001101101000110001110010000011010100101000001110110110010100000110111010010100001110110011100111111010100001110110101111001011001111000010011111101110001100111101110000011101110000110011001110111011001100001101010000101000110001000100001010111100001111100110010101101100100000101110100011110110101001100001101100101011011110110011000110011001011110 0011010001111111001011010101111001101111011000111111101000000011000010000000100010011000011111010011101010011011111111001000100001000010001111001101000110101000110010011000010011111110000110000110111111000100110000000111110011011000110110001100001111011010111011100001101100110100000111111001000010100110100010001010000111010101011001100010010111110100111001001000011100111111000011011011000100111011 1011001100100000000001000001010101011101111010011000011001110010011101000111001110011010011000000101101011011010100101010111111001100010011011111100111111100100100000000101011000100100101011101011010110010110100000110000110110110110111111000100011000001110001101101001110000011110001000000001101000001110000000110000111001010110001110010011110011000101100000011011000101000110100111101110111110101000 0011111101001111111001000110011111000111001011101110010010000011110110111110100010001110111100010111101001111001110001010111011000100001011011001001000110101000111000111100000100100110111110111000011010010010101000000100101000010000101110011000000100100001011011111011101000011010111100000010111001110100111101000011101001110000011000010010000011001010100101111000011010010000010011100011111100111110 1100011001001110111000011101100101010110001110011010001101000000000101001111010010111001010110101101110001000101111010001001101001111110100010010111100011100111101000100011001010000001111110111100011100000011110001101111011110001101011101100111011000111001101110011101110010000111001101110001011001011110111011110010011010101110111110000111110100100111010101110100011101000000001011110000000000101110 1100001110000010010111011110011110011010100111111001111111101101010111011011111110001011101011101100001110011110110101011101101010100011011010001100100001100100000010000010010101110110100100011110111010001001110110100111001000001010010000100101001100010111110101000100101101010000100110000001100001100111010001010111110000000001101111100011011000100010010011101100001111000001111100001110000000111011 0110010100100001100100100110000010101001001100011111000100111000100011101110100111011110000011111110010001000000100000111001110111101000100111010000110100101010100011110111001100011011110110000010000100110110001001011111011110100011000000011100100010111111011111100110100100010100000001101010111010100100111000000010101011100101010110111101100111010000011110110110010100111110001100010110111010010011 1110110001101000011100000011101111001111100111011101011010101111010100111101001010111010001101010000001000100001010011010110011010011110111111000110001101000100010100110100111110101100100111001010100111011101010010111011011000011111111110000100110111111010111111111001001110000110110000000010100010101100000101011100011011101000100011101001100101000110011010111010000011110100101101100001001111011101 1010011001110011101010000100110011100000001001110101101110001011100111101100101101011011100000001100001000010111001000011100101100010011111100111010010000000100111001111111101110001110100100011001010001010010011111000110011100101110101001100010111101111010000001010111010111110100100001101101101101111010101100010010010111111111010000011100100100110000111011111101001101001110111011010101010111001110 0011011111111001101101011011010110111000000011010010101000110001010101101101001010101111100000000110101100000011101000100101010011000000011010010100000110100000000000111101111100100000111110100000001110101101010010000101111011100100100001101100010001000010111110100110101001011101010001101100110011111100110111000001101001111110010000110111111000111111100110000001110000110001100001000001000101010101 0000110100000101000111110010111101100001110111110110001011110001011110101011111011111111001000001100011000101101101100111010100110001001111001010110011000111000100111111011111110000110110000111110111111111010001001110101111010101001010000111100111110010010010111101110011001101110101001101000001111000110001011011010000001111111010110000000001001110110110110000100000000000001010110010100100101101101 0110000001000111001011110000111111101111010100000100111010101110011000000100101101011111000110111100100111001101101111011010011101111001111100111000010011100000001111001010110000011101001111011001000110100011100011101011011011101110110101000011100011010101001011000011111100110011111111101101111001000110001111001110100000001100100001011001100110110001011111100101100010100010011010000010111111011101 0010110000110011011010110101111111011100011001001111110010111100010001100010101000101010011010001111101010000011000010000111001011010000111010101111111000100010011011010110111011101111000101010111011101111100100111100100000110001011010010010000000110110011010100110101111110010111011101011001110001111111111010110010000101100111101110000001001000100011001100100110011000110001001100001111010110100100 0011110111111111110110001111010000110101101010001000011011111010000101101010101111100010111100010110100101001111000001111111001001001011111001101001101010100110101010011001100110001001111101011111110011111100001011110100110100110100110100101001010000010001000001000010111000101110101011110010111100100101000010110100001000010001010110110111100010010100101000110011110000000101010001111010000000011101 0011110101000110001010010110100001100001000101011110101110111010011011100111001000101101101110010100001101100010101010010011000111010001111011110000111000100110001110111011011011110101010010011110101100000000001001010101110110101111101101100000100010011010000010101110001111001110101111000011011010110101100011111111110011010010001110100010000010110010100101000001110100110110000010010000001010111110 0001110101000100110101111011000011101011101111000011111100000100101000010111001000000010111110000000001011110011000100111011011100110010010111000101111011001101011000100111001111001011010111111011101001001110000110101011111110110110010111010001100100010001011100010101100100010001110100011011110100001010100011010100000010001100011000101101010011111000010101001100111001110001101000101000110001100010 1100000011000111110100100100011100011010001000100001011110010101010011001111101010100000001101101101111010011110101000100100110010010111100111100110000001100000101100001001100000110000110011011010111001010001110010100011000100100001000101010110110001101000010000011110100110100001010111110101001010101011110011110100010100010110010001010110110001000100111111001001100100111001100111110111011001000011 0111101100101010100010110001010000101100110101110000001011100011110101011001011100100101111011010010001111001011101101011001111111010111011010001001111111101000011000001110001110010100100001100001001111001000011110110001011111101100111110010100111101010101100110100000100100100110110010111100101001000000110001100001100110111101010001010100100101010110001110011110001100000111011001111110001010001100 0111001100000010110010110011001010000000110101010001110100100000110110001011011100110100111000000110101101111110010111100000000010001100110011011011111110011111110111100000110010010101110000010001101011111111010010011001000111110000111100011010000000110101000001010101110101001001001100000010111010101111100101101000100101111111000001000100111110010001001100011100010000100011010110001000011011010010 0100001110111100110111011010110111110110110010010000011101001001000110101101001010111000111011111001010001111010100010100001111000111000100001111110000001010110001111000110101100101110011001011001110000011101110001111110000100110011001101011100011110001101101010111010010111010110111000001001110111100110100010101000011101100100101111100110111001101001000000000101100000110010001100110010111011011101 0101000101011101001110110011011110101010011101001111101111100011100101101001010100101011110010101000111100111100110011010001000010001100101011011000111110011100101010011111001011010110001100010001111100001000010011011001001101110000001000111110000111001001000010011011011101110010101111011111101100110010110011001111000000110111000010000001111110000100011001011001100000010110101000110011010101000110 1100101100100000111101000101011000100010101001101000010110100100011100000010110111001010110010101000000110001111010111000000101001110011010010111101011011001111001011010000001100010101011110110000101000111000011111000100011010110000000000110101101000111110001100010011101000000011010101100001110011010110111000100101110010000110100100111110011110010100101110000111000110100110000011011110111011011010 1110111110000011000000100010011011010011100100111101001001110000001110101010011100101011011010011100110101101111101100110110101010000111011110010001110110011010001011011100100000111010100110001011100100001011001001110110000101001110111011111000101101111010011011110110111001110010110011001100101110010100011001010011100100111110000111001010011100100001000000101100010001001100010110000101101011010101 1011000111011000110110100010111110100101010100110000000101110010001010110011010110011011011110011101110101010000111100000100010100001111011111001110010011010010010000000100000101101011001000000001101101000100110011000010001000101100111110100010111100011100001011111010111011011000110111111000000001111001000000101010110100010111101111001011101010110111110100000100100101011001010111000100101111000011 1100001010111011011000011101001011001010001001001111101101001011110100011000100010101101100100001001101101010001010110011100110001100010001101011110111100110101100011111101111011110011001111100111011101001011100110111110010111110000010001000010111001000011010010000000100000001110111011011001111010111001000101001001001110100011011101001111110110001101100101110011101001001001010001110101110001100010 0000010000111010100000111100000111010010111001001111000111101110110001010100001111010110010000010101101111111011111100101001100010010110101101000101111001000100011011001100001001111011011111110001111101010010001100111111001001110011100000001101111110100000110000000000110110100101110100011100101111110000010111010110110101011110101101100101111001011010000011001000000101010100011111001101100001000110 1001100100110111011111100111100010001101110100111101110101100000011111000111010000110100000010111010101111100110110001101000101001101011111111001010101110000010011011000000000111110111110001001100111100100011010000101111110111011110000000101011010010011010011011000011100000110101111010100101110111001110011110001001100011001011010011001100100001001101001101100001010111011110010100001011000111001010 0100111011100000111010000100011000000011100101010100010111001110001001111001110111011101110100010001110101100110111101000001110010000000010011110100010101100000001101111100111001010011101000101101000100111110111010001100101110101001011001011010001010101100111000110011101111110001011111110100000001101110100111111011100101011011001011000111010011101010110011000010010000011100110001100111001010000111 0011110110111001001001000111001100110011011011100001010000000100100101001110011110101011111100110101100001111100110111101011101010100010000110101000010011110011000001000000001010011001100001101010101001101000111000011110100101100010010011110001100111110111010000100001001000101100100001110101000100000000011100001000011100000111101010111011000110010101010000110000110010011111001111001101110011000101 0110011001011000010101000110101111011010111111010100011000001110111110110111100110000101101000010010010101111000000001100111101001100011010110011100111010010100101001100010000011011010000110001001110001101011110110011100111101101110001001101111111011001111010011100001101100001100011100101001111011010100111111010111000000011010011101111100011001011110100100000100000110000000100011111011100010110111 0100111010111110111010010101110011001111111110010111111000011100101100011011101100100111110110110111010111110011101010010000011001001100000111111111101001011111111101010100010010100010110010011111001000100000000100110010011000011001111001010100010100101110000111110001011111010011000110000100000111110100000000100110110001101101001110011101100100011011000000001111000000101101010110000001010110011000 1111001001111101111000101100000001100010010101011100000000110010010111011010010011000010111110111000001010011010101110001011100010001010101111100111111011001011010101011100111101101000101100010111010111111101111101101110010100011001111111100011100000001111011001010000000101010011101010010000000010000011101100110100011010111001101000011010100001101101100101011101110101011111001001111011001010001100 1100101000110111100110110010000010100101011001011111011110000001010011001000100111111100101101000101100101100110001011001111011010001010111000001001000111010010100101011001011000000110111010000111001100001010011011010101111101110010000001101001111000010101011001000000001001001110101100000011101100000001100010000001001100001110111110100000000111111101101001010100000010000000000111000101011110111010 1101011010101000100101000100110111100000001110111011101110011010101100000111010111000110111000010100000101011110101100000111000100111110111001000010000011011111101000111100001010010010010010010101101110100110101000010101110101101011000110111000011110100110101101111100111011111100111110101100001001101000111000010000011011000101010111111001000000010001010110101000110111011001000000001010101110111010 1101011000111100001011010010010001011000110100100100111101111110111101001110000011000101001011010110110010110001100100100011001100000011011011001000100010000100111001100100110000011011100000000001100101011100110000001000011010010110110110011110000011011010110110100001000100010110101110010101000110000110100101110001001100101010000000000001001000111001001111011100111111111110101001101011101101110110 0000010101111011100100001111010110001111000001110111010010111010110000111000101111101101100110010001001011111011101110101000010000001001000111101111111111101110111111101001010000101011000100111100011111010010010010110010000001001110101110100010101011101000111101110001110010111101111101011101011000000011001111101001111100100110110111101010111010101110011011010110111100001010110011000101000111000100 0010010111100110111000010101110111000000101011011000011100010101001001001101000000010100000000000000010101110000101010111010111010101011001010001110101011100001011101010010101111010100000011001110001111101100110011111111111010110010111101000101101111000010010011100111000001010011011110011010111110011110010111000011001101101000100110000110110010100001010011111110011011010010011010011011001010111001 1011111101000100110010010011100101111111000000101001001111000111001011011100010000100101101100001000000010100001011010010110101001111011100010000100000110011001000011101011100110100011111101100011100101000010011011101010010011011100100100111100011000111111010110010101010110010001110001010110010001010111001001011001011100001010001000111001001010000111111111110010101000110001101101100110110001101101 1011001111111110111000111100100110111010001101111000111000001010101100010000101010110111010001101011010101010101001101101100011000001111000111110100110100010111001001101101101011010110010010011011100101000100011011010100101111100000100100010110010100011111001010001000110000011111011000011011101010010111011100111101001010011101101110000110110110110100101111101110001100100111011000000010011000111111 1100111100010011111001010010111101010100000001100001101101111110100111000110000111011111011111100010101111100111101000011111100110011010100110001011100010000001101110101011001011111001001100100101111001111100001000110010000011010111000111101011010000000111100111111011010110011010100100100010011111110001010101010000100100101010010010111111001010011110010001010101111101101100110101011000110010110110 1011100101100101010010100111101010001001110000011101111001111100100111001010001011100000011110011100111110100010111000000001101101001001010100010010101010010010000000000001110000000111101001101011001111110001111010101101000000111100111100110101000101101001110001000010110101001111111111011110110100100001100011000101101010001010110010010110111111100000001101101110001101111100110010101100101100111000 1010000101100100110101010111011001101010110100000000010001111101010100100111000111011011111110101011111111001111101010011100010000111101010011001101111101011101010001001010111001011101011011000110011101010110110011110110000100110010111111100001001011000011000110110100010100111111001100111100011000101000111101011010101000001010001110011001011001010110000110001011000100010111110011100100001001111101 0101001110011100001011111100011100101000000100000011101111010010101101101010000101101001001011011100110011111110001111111111011110111100100100110110110010011010100001111101101011011001010100110010000011000010010111011100000101000000011111000111110000110001111100100110011010101111111110100001110111011011000111001110001101111010000100011111010010101111001111011110110010101001000010111111101111100110 0101001110111111110100011101111110111010011111100111100110011001101100011111001101101100010100000011000110111001110001100000101011110101011110010000010001010111011100100011111110101011110110101100100100011010001001111001111001011011011010110010100111011001100101011111111001000011010011111000110100110010110000100100011001000001000000000101000010001111010110001111111100101111000100100100001111001010 0101010100100010000111100010000000011100110000011110010101011001001010110010110001010000110000001001011110010000001001000101011001101111101110101011011100111010100100000101010111001000101000001101101000101101011001101001000010011111011011000000100111100001001100101001111111011011101010010011101100010000100010010101101001001111111011000100011011110100101010111100011000111010010110100000000011110100 1110000111101100001000100010001111100011101010011100111101101001111001100000011000000111011100011111001000011010101101010111001000011010000110011101000011101011010010100101010101010101001100011100100110110101010110001110111101001100001111111001111010010000000101011001000111011001001110100010101010010010011010110100100110111011010011001000001111100101110110100011011110100010010101100101010110111010 0100010010101100110110100100010101001110011101111100110010100111100000001000010100101110101101100101100010000001100001100111110011001000100110110110010000111011001111100011001100011011010001101101110011001101110100111100100011011010011101011111101011100110110000010000000000101010011110011100001010001001010011110110010001110100101100010100100101101000100001111000111111011101011001001000010110101101 1000110101110110001011110010001011100011001001111110000000001110011101010010111111110111000010011111001001001000011010001010101011011101001111010001000010001010110101010011110011000101011100001110111001001001110011101100010110000111111011101110101111010101111111001101111110100100001110001111001110000001010001011101011111001001101101010111001100101100101110110100010000010101000111011011010111111110 0110001110100001101001011011111001000000100111111101000100001100101011001111110110100110001100101001101001111011111111101011001110011110000011111101010111100100001011101111100000100011011010101011100100111111100111111111111010100011011111000100101110010100111011100100101110000101001001111001111010001010000110101111110100101110011100100011001100000111001011000100111101000111111010011011110100001111 0110011111000111100111011010111000100011110001100101101011011001100111000111101011111000100111010011101010100111111000100100100000011010111000000000101010010001001011010010000011111111110010110010010100001011001010001011110100010100011011111001110011101110011011101010011100100011000110011010101001001011011110001000111010110011101001011011001001100100100010010101101101011100110011000110101101010000 1000010000010101010100100100010101010001100001011001011101010100100100100110111000101101111101011110101101000111011100010111110000011110101110011000011000000110000101011001111110001011111111000110111110001110011110100101001011011011110110100000100101111101010000010001101010000101000000101010110111111011111010001100101111110011001001010000111111100111011001111111110110000000100001111101100101000111 1110111001110110100010110111000111100001001110101001010110100101101001011000000110000110111000011111110101110001111000111010110011000010010000111011011001111011011011000000011101001000100001110010101000001000000101000000000100001101111001101111111110110100111011011111101100000100010001101111110101100101010100111111110000011100100101000010000100000111000111101110011001110110111001010011001001010100 0000101001011010000011110000111001001011010001000011101001011000100101100100010101110011110000000101000100011111111110111110100000010001110110001101010100000110010101011101101000100100010001011000001010100001101000100011001000100000011001101000000101010000110010100111010100011110001101111101001111110011100101011011001110111111101001111100100010000100001111100110111010010101110100111000111010000010 1001111000000010011100101001110010000110000000111011101111100100110001011101011111101011101101101100110110110111001010111111101100111110010001000111000000001111011110100110010000000000110111101110001010010000011100110110000101001011000011010010001011010011111010101011000101000101111111111011111100101001111010001110110011100100000111010001111110001100001001100011011111001010111010110100101010010110 0101100001011111101001010101110110001011001101111001000001111100110110000001001001010011101011011000010100101000000001100110001100110010011101110100000110111111000100001101100010001000011100110101000111100000100010111101001010111111001110000101110100101100010010110110010100101000010101000101000011010011010001001010100101010011011010010011001010001110100011100010010001000001000000010011100001110011 1100101000011110001001100101001000011100111001011000100100001101011111010111000111011101001000001011101111010010011010000111010100100110011010101100011011000100110100010010000101010111110010011110111111111011111011010000101100100000000001011111010000000100111001011110001000001101001011010011100111010011110011011101001001100001100110100101011101001101000010100110100011001000001100110111000001111100 1110011111100110000010011000011100100010000010011010010111001010101011110001100010010101101000111111001011111100010100101110000110010010100110111101101110011111111100110011011110101010011000011011000011010110111010001110010101010110100001010000001011110001001000001101111110101101110011001010010101111101000100010111010000011101000010001100110001100110001010001111100001011011010101001111100100001110 0001110110000111010101110001001101011001110110100101111100010010110101000001110101010110110101001000110100011000101111110010110100110111111101111010110010100111110011111110001110001110100111000100001011101101110111010001010000010011011100101101110000001110010100011010001100000100110011100110011110100001001110101001000101000111111010100000001101011100010100010011001101010110010001010110101110010010 1111010100111000100010100101111101010000110000110001111011110101010101110000110011110111110111010001111000011011101100000010011100000100101001100001011011011000101101100111001110001111000000110110100110100000110000101000000111010001010001010000000101000001110101000101000001101100011011011000011110000010000110001011101011110110100001011100111111011110000100110001001010101111011010111010000010001001 1100100110110011100001110111011110111000000001100010111011101110001110001101110000010100011011101001111110011101010010001001101000011000101100100111110110000100010010101000000001100101000001110011010011101100011101010101111011110000110100100010100100001110000110001101000011011101001010101101011011010010100111110011101100011010010001111101010110100010101100000011001110001110101010111100001110101110 1001101000001011101100110111101111110100001111001101100001100101000110100111000000110100100101111101011100011111011101000111111111101100100101010101000100101100111000011110010100011100100100110010010111011110101111000011010101011100101111110101100110110100111101111100011101101110011100100101011001100000010001001101100001011010110000100110001001110000001100000010011000011110100001101100010110011100 0010010001001001000111110111010101010100111011101000001101100111001111110101101000011111111110001100111000001100111101110000011100101011100101000101101001011100101100110111011011100110100011101111100010111110110111001101111110100100111110001010000100010001010010000101011000101011100000011101111000111101100011001100000001000111010111101010011111101000001111101110100100001110010011001001101101110110 1110101000101111011010100001100010110101101110010001100111001111000100110000101111100101110000010011100101011011010011110111000111010100111010010110001100010110101000000001100001110101011010000111010100110011111111100011010100111110011100001100110101110010011011111110101111010010001110100010101010000111111000100000110010001001011011111101001001010100111101010000111100101111010011101001011001100000 1001000101001111001001111111001110110110010111110111001001010101001111101000100000100011111111100000101010000111001001100000101000111010100001110000100110101101010101100000000100000111010101111001100110001000011100000001001001011000110011001000011011000001000110000001011100001111000010011011101011001111000000100011101000111101110111101011110001100000010101111010101110010001010001010100110011011110 0001100001101110001011010001101101110101101011100010010110101010010100011111010001111111110001001010100111111010010111000111100111101011011000110011011101000000111101010111001111100001001111100110001011001100101000110010101001111111010101110110010010110001001001100101011100000100100011111000001111010011000100101111100101110000010111011111011110100110000101000101100111001110100001000000100100010110 0010100010001100011100110000010001001110001000110110010100000100010100010010110111110100111100010000000000001111000011111111101111000011100110110001000010101001100110010111100100110011000000101011100110001001000101101111110110100100111110011000101010101011011010000110010100110101110000101011110110010100110101000010111001010011001010000110100100100010110101111001111100100011000001100001001101010101 0110011111010100110101101011010000110000101001001001111100110110001111000011001011111101101111100100001100111111010110001100111010001011000000101101100110100110010101011101010110110010100111011001110011010101100010110110100110100110101011100110010100110101100000110100111010011010100001101101101011001111000011100101000101111011011010111110001100001000001011011011100111110100000001011101111001101100 0000111110001100110011010111001110000111000101100101111001001001011001101011101111110001111110110001110011010000000101011010000010101111100010000001110101011110000101000100000011110011101101011110001111000101100101010100100101011001000010100010010000100001010011010010101001011111101000000100110110001110001111010011110110000000110001011001101110100010110100010110010101111111011111110111100001111011 1000001011010001011101000010101001001011110010001010001111001101010000001000110010101100101100010110110000100000110110010011001111110111100010011010100100111100000010011100101101100001100010000110100001100011111111010000001100101010001110100001011010110001000100100101100100111110001100101101000011111011000010100001111110011011100000001011011011100000000001010010110011011110101101011111101101111000 1000110100101001011010011111010000010101001100000101000010001010100011110100011000010110110000001100010110001100000010001100010000010101010100111100111100100011110011010001110101011111001100111001000000111000010101111001010110011010110110010010011111011001111110110011100001101111000011001100100111101101001011110100000010000101011001101111010111010100111101111010110101011010100010010101111011110110 0001010001101101001010111000011010110100000010111010000010100111000010010010100110100100010110101010000000001110110011101101111111011010100100100100001000011111000000110001111000101000011010111100000001101111000001001010111011000001100011001101111110110101001011101000011000100101101110101100111110000000010101110010111001100001010001011001001000100001001010010001111100101100011011111111000001010001 0011010011101100011111100001011101001000010010011100101010110010111110010010100000101111011010110000100100111110110010101100111100010011010011111100000111100101000111000110100110000110100101111100010110000111010001001101100100011010001011001110001000000001000101000010111011110010101111001100111101101111011100101111000010100001110000101011000111011000110000001100011010101110110110111000111101001001 0010100110101001001000101100011111110010010100000000000000101000101101010011001111111000010011010010001000100111111001010000000010011110101100000100011110001110010001110111100011010110000100111011100100001011111110101110110001000111110111111010110011101100011110100110000001101000011000000001011110100001001000010111001010110001100010111000101101110010101110100110100101000001011101110000110011111110 0000111111100101010000000010100011010001111110101110011010111110110011111110111110101101100010111110011000000000001110011000011011011100101000100010111101010011111001000110111101000000001010010101101001010001010110111001111010010000001100001001010101000001110010111101011110001100001011110001110110101000010100000100000001010000011100011010100010001110000100001000100000110000110011000111010100100011 1001001100110011010001100101001100010000110101010110111010101000110101111000111010011011010110110100110010000110110011000000110010001111001101011100101000101011110101110011100101101001010000010000001001010001010001001000010000100100111001100010101000110100011010011101101101101000110111110000100011111000010100001110001111000011011101110010101111110101000111011100110011011100100101110110010111001011 0100100110011110101111100001100010101011000001010111110100011100011001010111111000001110010000010000100001111111100000001010110000111010000011101000111000100111100010111011000011111000001110110001110011011101010000000100000110101101110010110111110111010110011001001000000001011000111011010101100101010101100111011101001101010011101000011000110001111110100010000011111011100111001011001111011110001100 0011011110011111001010010110111011100011011111110111100111001000011011000110100111110100011100001110000100100111111011011010110000001011101001111001111011111001100110001001100010111101010011100001111010001010000000010001001111010101011000111101001011100000110111011110000000010110011100110111010001001000010010101011101000010011100010100110010000001001010001100000010100100101111100101000001001111001 1010000111111011101011101110011011111100010101110010011010001110110001101111000110110011110100000111111101110001011111100100010100111010010010011110110010001100100101101111101001000010111000101111010110000001010011101011100011110100011111110001001100111000000010010101000001110101100000001111100000001010000111010100000001000100000110000100111010101101011011100110110101110011010000100111100100011010 0111011100001000100111000001001100000101100011001001010101100111111011001000010011110100110001000001110110111011000111110110001110110000100010010101100100000110110010100101101101010001001011000101100001111110001100011010111111001101000010010000000001010001010101000110100100011111011100110000100000100001100001110100011100110110010010001001111100100100100011011000010100101001100011101111001011010010 1100110100111101001101110000000110000010001000000100011101111111110110001011001110111011011011001011110111101000010011010100101111100101111100010100011011000101010010000000010110010001110111110011101000000010110011000011111000010010101111110001010011011100010111000000101000011101100101110110011111001000110101010101100101110000000000101001001100110100000000111011110001110100111010111000000011110010 0101100001000001000011000011101101000101010000100101000000001111010110110101101000101010011010000000011000011000100101110010110100000011000100000011000010111001100111110101111010010110010111100110000100110011010011001001111001110110011001000111011010011100000101010100101101111101001110110110011001101111110010001000010110011010000001111010100100011111110111111010101010010001011000011000001010110010 0000101000001110010010100101101001001010101010100101001101000011010011101001011011000101101011101000010000100100000101000011010111010000101110001110111111110000101010111001110101010010000101101110101110110001100010001000111100011111110011111110001001000101100100100110011101011100111100001110110000110100001101000111110101011000000100010111110101100100111001111000000100000101000010000111001000101001 0010100000101010110101001010011101010000100000000111000100101110000010111101010110100010000000101010101001101000000001110101010100010101110110101100101000110111111000111101011011100001101011100111000111000100111001010011000111110100111011111100011001101101111101000001010100111111111000011111110011000010000010000110011101001110010110010110011000000110110101011110001011010010011001100111100111001100 0100110011111010110010000000000110111000000000111101111100100000001000000010000001011101001001001010110000011110000110001101111010111101100010111100101100101011011000101001111000000111100010110100011110001011011011110001010001001010000000110100011010100000011010010100001111011101000111000101110101100101111100001011110111011001000001100111001101000100000010110100111001010001111010001111001000000101 1011110000001100111110100110110000011001000000101110001101001110010001100100001110001100001010111100111100000101111010001100011001111110101110101010110000000111011101111010010000110011111011001011111010001100011000000111000100001101011110111101001110010000101110111010000110010011101001101101110000001010011011011001001110101101111010010000110011110000001101101010010111010010111001011111000110100010
cTrader Algo

【cAlgo】サインツールを作る【SampleCode】

5/1/2021

4年以上前の記事です。内容が古くなっている可能性があります。

サインツールを手軽に作りたい

サインツールってあるじゃないですか。こんな感じで売買タイミングを示してくれるインジケーター

もちろんサイン通りに機械的にエントリーするなんてもってのほかですが、決められたルールでサインが出たときだけエントリーするかどうか検討する、みたいな使い方をしている人は多いと思います。

今回はcTraderでこんなのを作ってみましょうというお話です。

 

単純なサインの出し方

例えば、終値が20期間MAを超えたら矢印でサイン出したいとしましょう。こんな感じかな、と。

SimpleMovingAverage _sma;
protected override void Initialize() {
    _sma = Indicators.SimpleMovingAverage(Bars.ClosePrices, 20);
}
public override void Calculate(int index) {
    if (Bars.ClosePrices[index] > _sma.Result[index]) {
        Chart.DrawIcon("buy_sign", ChartIconType.UpArrow, Bars.OpenTimes[index], Bars.ClosePrices[index], Color.White);
    }
}

ただ条件判定して価格部分にChart.DrawIconでアイコン描いただけです。

でもこれだと少し問題があります。このあと、値が戻ってMAを下回ってもサインが残ってしまうのです。

おそらくこの類のサインであれば本当に知りたいのは「バー更新時に前の足の終値がMAを上回ったか」だと思います。

であれば、バー更新時だけ条件判定しましょうか。

SimpleMovingAverage _sma;
DateTime _lastTime;
protected override void Initialize() {
    _sma = Indicators.SimpleMovingAverage(Bars.ClosePrices, 20);
    Bars.Tick += _=> {
        if(_lastTime != Bars.LastBar.OpenTime) {
            OnBar();
            _lastTime = Bars.LastBar.OpenTime;
        }
    };
}
private void OnBar() {
    var index = Bars.Count - 2;
    if (Bars.ClosePrices[index] > _sma.Result[index]) {
        Chart.DrawIcon("buy_sign", ChartIconType.UpArrow, Bars.OpenTimes[index], Bars.ClosePrices[index], Color.White);
    }
}

IndicatorにOnBarメソッドはないので、自分で用意してあげる必要があります。(BarOpendイベントやIsBarOpenみたいなプロパティはあてにならないので非推奨)

とりあえずこれで更新時だけサイン判定ができるようになりました。

しかし、これだとリアルタイムでの判定はできません。実際はリアルタイムで条件満たしたら未確定でも一旦表示してほしい、ということも多いでしょう。

ついでにいうと、これだけだと過去のサインは表示されません。表示させたければ、Calculateに別にロジック書くか、過去分判定用処理をどこかで別にする必要があります。

 

いろいろ考えると結構面倒

ただサイン出すだけのツールとは言え、作ってるといろいろ出てきて結構大変そうですよね。毎回サインツール作るたびにこんな共通ロジック部分に時間かけるのもばからしいです。

というわけで、これらの要望を簡単に満たすべく、サインインジケーターのテンプレートとなるIndicatorを作成しました。

これを使えば面倒なことを考えずとも条件判定ロジックのコードを書くだけで、サインインジケーターが作成できるようになります。

 

SignToolsTemplete

主な機能

・サインはリアルタイムで表示されます。未確定のバーでは出たり消えたり繰り返します。

・サインが出たら音声とチャートに色付けてアラートを出すことができます。(アラートの色はチャートがアクティブな状態で何かキー押せば消えます。)

アラートを出すタイミングも指定できます。「その足で最初に条件満たした時点」か「毎回条件満たす度」か「サイン確定時 (足更新時) 」かのいずれかで指定します。

・検証用に過去チャートでサインが出てる場所にボタン一つでジャンプできます。(冒頭画像の右下のボタン)

 

ダウンロード

こちらからどうぞ。サンプルとして2本のMAのゴールデンクロス、デッドクロスでサインを出すツールになってます。

Indicatorクラスの中身を自由に書き換えて、お好きなサインツールを作成してください。

 

使い方

ダウンロードしたサンプルを見ればなんとなくわかるかもしれませんが、一応解説します。

仕組みとしてはSignIndicatorクラスにサイン表示やアラートを丸投げしてるだけです。作成者がやることは判定用のメソッドを作って、SignIndicatorオブジェクトに登録するだけ

 

①判定用メソッドを作成

まずはどんなときにサインを出すかの判定メソッドを作成します。このメソッドで受け取るindexはCalculateのindexと同様のバーインデックスです。

ダウンロードしたサンプルをそのまま使うのであればBuyOrSellメソッドの中身を消して、ここに判定ロジックを書いてください。

//-------------------------------------------------------------------
//  サイン判定メソッドはこんな感じで用意
//     必ずindexを受け取ってTradeTypeかnullを返す形にする
public TradeType? BuyOrSell(int index) {

    // --- ここで条件判定を行い、買いサイン出すならTradeType.Buy、売りサイン出すならTradeType.Sell、サインなしならnullを返す。
    if (index < 1) return null;
    if (LongMA[index - 1] < ShortMA[index - 1] && LongMA[index] > ShortMA[index]) {
        return TradeType.Sell;
    } else if (LongMA[index - 1] > ShortMA[index - 1] && LongMA[index] < ShortMA[index]) {
        return TradeType.Buy;
    } else {
        return null;
    }
}

自分で作る場合は返り値と引数の型さえ同じメソッドであれば名前は何でも構いません。

買いサインを出したいとこで、TradeType.Buyを、売りサインを出したいところでTradetype.Sellを、条件合わないとこではnullを返すようにします。

 

②Initialize内でオブジェクトを作成し、各種設定

Initialize内でSignIndicatorオブジェクトを作成します。コンストラクタにはthis(Indicator本体)と、①で作成した判定用メソッド名を渡します。これだけでサインツール完成です。メソッド名を渡すときは末尾に( )を付けないようご注意ください。

以下はすべてInitializeメソッド内に記述します。

// --- サインインジオブジェクト設定
var sign = new SignIndicator(this, BuyOrSell);

設定は特になにもしなくても動きますが、色やアイコンを変えたい場合はプロパティで変更可能です。

// --- 色やアイコン変えたければ変える
sign.BuyColor = Color.Blue;
sign.SellColor = Color.Pink;
sign.BuyIcon = ChartIconType.UpTriangle;
sign.SellIcon = ChartIconType.DownTriangle;

また、デフォルトではアラートは作動しませんので、サイン出た時に音声ならしたいならSoundFileにファイル名を、チャート色変えるならAlertColorに色を設定してください。音声はNotificationsプロパティのPlaySoundでここで指定されたファイルをそのまま呼び出します。

// --- 画面色替えアラート。色を設定すると有効化
sign.AlertColor = Color.Yellow;

// --- 音声アラート。ファイル名を設定すると有効化。フルパス指定の方が確実。
sign.SoundFile = "C:\\Windows\\Media\\Alarm01.wav";

// --- アラートタイミングを変更。デフォルトはUpdate(バー更新後のサイン確定時のみアラート)
sign.WhenAlert = WhenAlert.FirstAndUpdate;

アラートタイミングはデフォルトは「確定時 (足更新時) 」です。タイミングを変えたい場合はWhenAlertプロパティを変更してください。

 

その他

サイン表示だけであればCalculateメソッドは使用しませんが、サンプルではサインのタイミング確認のため、サイン判定に使用するMAを表示させています。この辺りはツールに応じて自由にしてください。

また、サインをトレード検証に使うなら、右下に出現する次のサイン、前のサインにチャートをスクロールするボタンが便利ですので是非ご活用ください。(不要の場合はコンストラクタの3つ目の引数にfalseを指定すれば消えます。)

 

SignIndicatorクラス詳細

細かい設定したい人用に。

プロパティ
(ChartIconType) BuyIcon { get; set; }

買いサインのアイコンを設定します。

(ChartIconType) SellIcon { get; set; }

売りサインのアイコンを設定します。

(Color) BuyColor { get; set; }

買いサインの色を設定します。

(Color) SellColor { get; set; }

売りサインの色を設定します。

(double) DrawMargin { get; set; }

サインの描画Y位置のマージンを設定します。買いサインはローソク足の最安値の下、売りサインはローソク足の最高値の上に表示されますが、その時価格からどのくらい空けて表示するか設定します。

(int) JumpMargin { get; set; }

◀▶ボタン押したときにサインの右側に何本分のローソク足を表示させるか設定します。

(WhenAlert) WhenAlert { get; set; }

アラートを出すタイミングを設定します。デフォルトはUpdate(バー更新後確定時のみ)。設定できるのはFirstTime(最初に条件満たしたとき)、FirstAndUpdate(最初に条件満たしたとき+確定時)、EveryTime(条件満たす度毎回)のいずれかです。

(string) SoundFile {get; set;}

アラートに音声を使用する場合、音声ファイル名を指定します。フルパス指定推奨ファイル名のみの場合、C:¥Windows¥Mediaフォルダ内のwavファイルを探します

(Color) AlertColor {get; set;}

アラート時にチャート色を変える場合の色を設定します。

(WrapPanel) ButtonPanel

ボタンを表示しているパネルを取得します。ボタン位置を変更したいときなどに。

 

メソッド

パブリックメソッドはありません。コンストラクタが一つあるのみです。

SignIndicator(Algo algo, Func<int , TradeType?> judgeMethod, [bool showButton])

1つ目の引数はIndicator本体を渡します。Algo型を取るため、cBotのRobotクラスでも使えます

2つ目の引数はサイン条件判定用メソッドです。indexを受け取ってTradeTypeかnullを返すメソッドなら何でも構いません。

3つ目の引数はジャンプボタンを使用するかどうかのオプションです。省略するとtrueになります。使用しない場合はfalseを渡してください。


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2026 ajinori